Exporterノード
Exporterノードは学習済みモデルをデプロイや後で使用するために様々な形式でディスクに保存します。
| プロパティ | 値 |
|---|---|
| タイプ | 終端ノード |
| 入力 | 学習済みモデル(Trainerから) |
| 出力 | ディスク上のモデルファイル |
| 形式 | joblib、pickle、ONNX、CoreML |
モデルファイルを保存する場所。
~/Desktop/my_model.joblib/path/to/models/classifier_v1.pklエクスポート形式
Section titled “エクスポート形式”最適な用途: Pythonアプリケーション
- NumPy配列に効率的
- 大きなモデルでも小さいファイルサイズ
- 高速な読み込み
import joblibmodel = joblib.load("model.joblib")最適な用途: Pythonアプリケーション(組み込み)
- 追加依存関係なし
- 標準Python形式
- どこでも動作
import picklewith open("model.pkl", "rb") as f: model = pickle.load(f)最適な用途: クロスプラットフォームデプロイ
- 任意の言語で実行
- 最適化された推論
- GPUアクセラレーション
必要: pip install skl2onnx onnxruntime
import onnxruntime as ortsession = ort.InferenceSession("model.onnx")最適な用途: Appleプラットフォーム(iOS、macOS)
- Apple純正ハードウェアアクセラレーション
- Core MLフレームワークと統合
- ONNX形式への事前エクスポートが必要
必要: pip install skl2onnx coremltools
import coremltools as ctmlmodel = ct.converters.onnx.convert(model="model.onnx")mlmodel.save("model.mlmodel")メタデータを含める
Section titled “メタデータを含める”有効時、以下を含む.jsonファイルを一緒に保存:
{ "model_type": "RandomForestClassifier", "sklearn_version": "1.3.0", "feature_names": ["sepal_length", "sepal_width", "petal_length", "petal_width"], "target_names": ["setosa", "versicolor", "virginica"], "n_features": 4, "n_classes": 3, "training_date": "2024-01-15T10:30:00Z", "metrics": { "accuracy": 0.967, "f1_weighted": 0.965 }, "hyperparameters": { "n_estimators": 100, "max_depth": 10 }}出力ファイル
Section titled “出力ファイル”model.joblibをメタデータ付きでエクスポートした場合:
| ファイル | 内容 |
|---|---|
model.joblib | 学習済みモデル |
model_meta.json | メタデータ(特徴量、メトリクスなど) |
エクスポートしたモデルの読み込み
Section titled “エクスポートしたモデルの読み込み”Pythonで
Section titled “Pythonで”import joblibimport json
# モデルを読み込みmodel = joblib.load("model.joblib")
# メタデータを読み込みwith open("model_meta.json") as f: meta = json.load(f)
# 入力を検証expected_features = meta["feature_names"]print(f"モデルは{len(expected_features)}個の特徴量を期待: {expected_features}")
# 予測を実行import numpy as npX_new = np.array([[5.1, 3.5, 1.4, 0.2]])prediction = model.predict(X_new)print(f"予測: {meta['target_names'][prediction[0]]}")Flask APIで
Section titled “Flask APIで”from flask import Flask, request, jsonifyimport joblibimport numpy as np
app = Flask(__name__)model = joblib.load("model.joblib")
@app.route("/predict", methods=["POST"])def predict(): data = request.json X = np.array(data["features"]) predictions = model.predict(X) return jsonify({"predictions": predictions.tolist()})
if __name__ == "__main__": app.run(host="0.0.0.0", port=5000)モデルバージョニング
Section titled “モデルバージョニング”モデルバージョン管理のベストプラクティス:
ファイル命名規則
Section titled “ファイル命名規則”{model_name}_v{version}_{algorithm}_{date}.joblib例:
churn_model_v1_rf_2024-01-15.joblibchurn_model_v2_gb_tuned_2024-01-20.joblib
ディレクトリ構造
Section titled “ディレクトリ構造”models/├── production/│ └── churn_model_current.joblib -> ../v2/churn_model.joblib├── v1/│ ├── churn_model.joblib│ └── churn_model_meta.json└── v2/ ├── churn_model.joblib └── churn_model_meta.json大きなモデル用のGit LFS
Section titled “大きなモデル用のGit LFS”100MBを超えるモデルにはGit LFSを使用:
git lfs installgit lfs track "*.joblib"git add .gitattributesgit add models/git commit -m "Add trained model"よくある問題
Section titled “よくある問題”「互換性のないsklearnバージョン」
Section titled “「互換性のないsklearnバージョン」”あるscikit-learnバージョンで保存したモデルは、別のバージョンで読み込めない場合があります。
解決策: メタデータのsklearn_versionを確認し、一致するバージョンをインストール:
pip install scikit-learn==1.3.0モデルファイルが大きすぎる
Section titled “モデルファイルが大きすぎる”大きなモデル(特に多くの木を持つRandom Forest)は大きくなります。
解決策:
n_estimatorsを減らす- 圧縮を使用:
joblib.dump(model, "model.joblib", compress=3) - より小さいファイル用にONNXにエクスポート
読み込み時に「ModuleNotFoundError」
Section titled “読み込み時に「ModuleNotFoundError」”読み込み環境は学習環境と同じパッケージを持つ必要があります。
解決策: requirements.txtを含める:
scikit-learn==1.3.0pandas==2.0.0numpy==1.24.0セキュリティに関する考慮事項
Section titled “セキュリティに関する考慮事項”ベストプラクティス:
- 自分が作成または信頼するモデルのみ読み込む
- チェックサムでファイル整合性を確認
- モデルを公開共有する場合はONNXを使用(より安全な形式)
生成されるコード
Section titled “生成されるコード”import joblibimport jsonfrom datetime import datetime
# モデルを保存joblib.dump(model, "/path/to/model.joblib")
# メタデータを保存metadata = { "model_type": type(model).__name__, "feature_names": list(X.columns), "training_date": datetime.now().isoformat(), "metrics": { "accuracy": accuracy, "f1_score": f1 }}
with open("/path/to/model_meta.json", "w") as f: json.dump(metadata, f, indent=2)
print(f"Model saved to /path/to/model.joblib")