初心者のためのZenML完全ガイド:MLOpsの簡素化
初心者のためのZenML完全ガイド:MLOpsを簡単にする方法
データサイエンス、機械学習、またはMLOpsに初めて取り組み、ツールの選択肢に圧倒されていますか? ZenMLを考慮してみてください-効率化されたプロダクションパイプラインのためのオーケストレーションツールです。この記事では、ZenMLの機能と特徴について調査し、MLOpsの旅を簡素化します。
学習目標
- ZenMLの概念とコマンド
- ZenMLを使用したパイプラインの作成
- メタデータのトラッキング、キャッシング、およびバージョニング
- パラメータと設定
- ZenMLの高度な機能
この記事はData Science Blogathonの一部として公開されました。
まず、ZenMLが何であるか、他のツールとの違い、そしてそれをどのように利用するかを把握しましょう。
ZenMLとは何ですか?
ZenMLは、データサイエンティスト、MLエンジニア、およびMLOps開発者向けのオープンソースのMLOps(機械学習オペレーション)フレームワークです。本番用のMLパイプラインの開発におけるコラボレーションを容易にします。 ZenMLは、そのシンプルさ、柔軟性、およびツールに依存しない性質で知られています。 MLワークフローに特化したインターフェースと抽象化を提供し、ユーザーが好みのツールをシームレスに統合し、ユニークな要件に合わせてワークフローをカスタマイズできるようにします。
- AMDの戦略的なプレイ:Nvidiaの支配に挑戦するためのNod.aiの買収
- 「GANによって生成された画像をどのように評価すればいいのか、一体どうやって評価するのでしょうか?」
- サステイナブルな銀行業務のための生成AI – 炭素フットプリントの削減とエコフレンドリーな消費の促進
なぜZenMLを使うべきですか?
ZenMLは、データサイエンティスト、MLエンジニア、およびMLOpsエンジニアにいくつかの重要な利点をもたらします:
- 簡素化されたパイプラインの作成: @stepおよび@pipelineデコレータを使用して簡単にMLパイプラインを構築できます。
- 容易なメタデータのトラッキングとバージョニング: ZenMLは、パイプライン、実行、コンポーネント、アーティファクトを追跡するユーザーフレンドリーなダッシュボードを提供します。
- 自動化された展開: ZenMLは、パイプラインとして定義されている場合に自動的に展開することで、モデルの展開を効率化し、カスタムドッカーイメージの必要性を排除します。
- クラウドの柔軟性: ZenMLを使用して、簡単なコマンドで任意のクラウドベースのプラットフォームにモデルを展開できます。
- 標準化されたMLOpsインフラストラクチャ: ZenMLをステージングおよび本番環境として構成することで、すべてのチームメンバーがパイプラインを実行できるようにし、標準化されたMLOpsのセットアップを確保します。
- シームレスな統合: ZenMLをWeights and Biases、MLflowなどの実験追跡ツールと簡単に統合できます。
ZenMLインストールガイド
ターミナルにZenMLをインストールするには、次のコマンドを使用します:
ZenMLのインストール:
pip install zenml
ローカルダッシュボードへのアクセスのためには、次のコマンドを使用してインストールしてください:
pip install "zenml[server]
ZenMLが正しくインストールされているかどうかを確認し、そのバージョンを確認するには、次のコマンドを実行します:
zenml version
重要なZenML用語
- パイプライン: 機械学習ワークフローの一連のステップ。
- アーティファクト: パイプライン内の各ステップの入力と出力。
- アーティファクトストア: アーティファクトを格納するバージョン管理リポジトリで、パイプラインの実行速度を向上させます。 ZenMLは、デフォルトでローカルシステムに保存されるローカルストアを提供します。
- コンポーネント: MLパイプラインで使用される関数の設定。
- スタック: コンポーネントとインフラストラクチャのコレクション。 ZenMLのデフォルトスタックには次のものが含まれます:
- アーティファクトストア
- オーケストレータ
この画像の左側は、パイプラインとして行ったコーディング部分であり、右側はインフラストラクチャです。これらの2つの間には明確な分離がありますので、パイプラインが実行される環境を変更することは容易です。
- フレーバー: 他のMLOpsツールをZenMLと統合したソリューションで、コンポーネントの基本抽象クラスから拡張されます。
- マテリアライザ: 入力および出力がステップ間でアーティファクトストアを介して渡される方法を定義します。すべてのマテリアライザはBase Materializerクラスの一部です。また、ZenMLに存在しないツールを統合するためのカスタムマテリアライザも作成できます。
- ZenMLサーバー: MLモデルの展開と予測を行うために使用されます。
ZenMLの重要なコマンド
新しいリポジトリを初期化するコマンド:
zenml init
ローカルでダッシュボードを実行するコマンド:
zenml up
出力:
ZenMLパイプラインの状態を確認するコマンド:
zenml show
アクティブなスタック構成を表示するコマンド:
zenml stack describe
CLI:
登録されたすべてのスタックのリストを表示するコマンド:
zenml stack list
出力:
ダッシュボード:
最初のパイプラインを作成する
まず、ZenMLからパイプラインとステップをインポートしてパイプラインを作成するために必要なモジュールをインポートします:
#必要なモジュールをインポートしてステップとパイプラインを作成するfrom zenml import pipeline, step#ステップを定義して文字列を返す@stepdef sample_step_1()->str: return "Welcome to"#2つの入力を受け取り出力を表示する@stepdef sample_step_2(input_1:str,input_2:str)->None: print(input_1+" "+input_2)#パイプラインを定義する@pipelinedef my_first_pipeline(): input_1=sample_step_1() sample_step_2(input_1,"Analytics Vidhya")#パイプラインを実行するmy_first_pipeline()
このサンプルパイプラインでは、2つの個別のステップを構築し、それらを全体のパイプラインに統合しました。これは、@stepおよび@pipelineのデコレータを使用して行いました。
ダッシュボード:パイプラインの可視化をお楽しみください
パラメーターとパイプラインの名前変更
このパイプラインをパラメーターを使用して強化することができます。たとえば、’Analytics Vidya run’というパイプラインの実行名をwith_options()
メソッドを使用して変更する方法を示します。
#パイプラインの実行名を変更するためにwith_options()メソッドを使用していますmy_first_pipeline = my_first_pipeline.with_options( run_name="Analytics Vidya run")
ダッシュボードで新しい名前が表示されます:
ステップに複数の出力がある場合は、タプル注釈がある方が良いです。例:
#ここでは4つの出力があるため、タプルを使用しています。また、注釈を使用してこれらの出力が何を示しているかを伝えています。def train_data()->Tuple[ Annotated[pd.DataFrame,"X_train"], Annotated[pd.DataFrame,"X_test"], Annotated[pd.Series,"Y_train"], Annotated[pd.Series,"Y_test"],]:
日付と時刻も追加できます。
#以下の例では、日付と時刻をプレースホルダー内で使用して、現在の日付と時刻に自動的に置換されます。my_first_pipeline = my_first_pipeline.with_options( run_name="new_run_name_{{date}}_{{time}}")my_first_pipeline()
ダッシュボード:
キャッシュ
キャッシュは、コードの変更がない場合に前回の実行結果を利用してパイプラインの実行プロセスを加速し、時間とリソースを節約します。キャッシュを有効にするには、@pipelineデコレータと一緒にパラメータを含めるだけです。
#ここでは、キャッシュを関数のパラメータとして有効にしています。@pipeline(enable_cache=True)def my_first_pipeline():
コードや入力を動的に調整する必要がある場合には、enable_cache
をFalseに設定することでキャッシュを無効にすることもできます。
ダッシュボードでは、階層レベルは次のようになります:
モデルのプロパティを利用してパイプラインの情報を取得することができます。以下の例では、model.name
を使用してパイプラインの名前にアクセスしています。
model=my_first_pipeline.modelprint(model.name)
パイプラインの最後の実行結果は以下のように表示されます:
model = my_first_pipeline.modelprint(model.name)# Now we can access the last run of the pipelinerun = model.last_runprint("last run is:", run)
出力:
CLIを使用してパイプラインにアクセスする
パイプライン定義に依存せずにパイプラインを取得するには、Client().get_pipeline()
メソッドを利用します。
コマンド:
from zenml.client import Clientpipeline_model = Client().get_pipeline("my_first_pipeline")
出力:
ZenMLダッシュボードでパイプラインと実行のすべてを便利に表示できる一方、ZenMLクライアントとCLIを介してもこの情報にアクセスすることができます。
Client()を使用する場合:
#ここでは、ZenML Client()のインスタンスを作成してlist_pipelines()メソッドを使用していますpipelines=Client().list_pipelines()
出力:
CLIを使用する場合:
zenml pipeline list
出力:
ダッシュボード:
ZenMLスタックコンポーネントCLI
既存のアーティファクトをすべて表示するには、次のコマンドを実行します:
zenml artifact-store list
出力:
ダッシュボード:
オーケストレータのリストを表示するには、
zenml orchestrator list
出力:
ダッシュボード:
新しいアーティファクトストアを登録するには、次のコマンドを実行してください:
zenml artifact-store register my_artifact_store --flavor=local
「登録」キーワードを「更新」または「削除」に置き換えることで、現在のアーティファクトストアに更新または削除を行うこともできます。登録されたスタックの詳細にアクセスするには、次のコマンドを実行します:
zenml artifact-store describe my_artifact_store
出力:
ダッシュボード:
アーティファクトストアの場合と同様に、異なるアクティブスタックに切り替えることもできます。
zenml stack register my_stack -o default -a my_artifact_store
アーティファクトストアの場合と同様に、異なるアクティブスタックに切り替えることもできます。
zenml stack set my_stack
アクティブスタックが「default」から「my_stack」に正常に切り替わったことが確認できます。
ダッシュボード:ここで新しいスタックが表示されます。
提案と良い慣習
1. プロジェクトに堅牢なログ記録の慣行を取り入れる:
# 必要なモジュールをインポートfrom zenml import pipeline, stepfrom zenml.client import Clientfrom zenml.logger import get_loggerlogger=get_logger(__name__)# ここでは、2つのステップを持つパイプラインを作成しています.@stepdef sample_step_1()->str: return "Welcome to"@stepdef sample_step_2(input_1:str,input_2:str)->None: print(input_1+" "+input_2)@pipelinedef my_first_pipeline():# 'logger' を使用して情報メッセージをログに記録します logger.info("This is a demo project") input_1=sample_step_1() sample_step_2(input_1,"Analytics Vidya")my_first_pipeline()
出力:
2. プロジェクトには、構造化されたテンプレートが必要です。クリーンなテンプレートはコードの可読性を向上させ、プロジェクトをレビューする他の人にとっても理解しやすくします。
My_Project/ # プロジェクトリポジトリ├── data/ # データセットフォルダ├── notebook/ .ipynb # Jupyterノートブックファイル├── pipelines/ # ZenMLパイプラインフォルダ│ ├── deployment_pipeline.py # デプロイパイプライン│ ├── training_pipeline.py # トレーニングパイプライン│ └── *その他のファイル├──assets├── src/ # ソースコードフォルダ├── steps/ # ZenMLステップフォルダ├── app.py # Webアプリケーション├── Dockerfile(*オプション)├── requirements.txt # プロジェクトの必要なパッケージのリスト├── README.md # プロジェクトのドキュメンテーション└── .zen/
包括的なエンドツーエンドのMLOpsプロジェクトを作成するためには、このプロジェクトテンプレートに従うことをお勧めします。ステップファイルとパイプラインファイルを別のフォルダに整理するように常にしてください。コード理解を向上させるために、徹底的なドキュメンテーションを含めてください。 .zenフォルダは、「zenml init」コマンドを使用してZenMLを初期化すると自動的に生成されます。ノートブックを使用してColabやJupyterノートブックファイルを保存することもできます。
3. ステップ内の複数の出力を扱う際には、タプルのアノテーションを使用することをお勧めします。
4. 定期的な更新のためにパイプライン実行をスケジュールする場合、特にenable_cache
をFalseに設定してください(新しいデータの動的なインポートなど)。
ZenMLサーバーとそのデプロイ
ZenMLサーバーは、パイプラインを保存、管理、実行するための中央集権のハブとして機能します。以下の図を通じてその機能を包括的に把握することができます:
このセットアップでは、SQLiteデータベースがすべてのスタック、コンポーネント、およびパイプラインを保存します。「デプロイ」とは、訓練されたモデルを本番環境でリアルタイムデータに対して予測させることを意味します。ZenMLには、ZenMLクラウドと自己ホストのデプロイメントの2つのオプションがあります。
ステップの実行順序
ZenMLはデフォルトではステップを定義された順序で実行しますが、この順序は変更することができます。以下にその方法を説明します:
from zenml import pipeline@pipelinedef my_first_pipeline():#ここでは、ステップ2が実行された後でのみステップ1を実行するようにしています sample_step_1 = step_1(after="step_2") sample_step_2 = step_2()#その後、ステップ3をステップ1とステップ2の両方が実行された後に実行します step_3(sample_step_1, sample_step_2)
このシナリオでは、ステップのデフォルトの実行順序を変更しました。具体的には、ステップ1がステップ2の後にのみ実行され、ステップ3がステップ1とステップ2の両方が実行された後に実行されるようにしました。
ログの有効化/無効化
「enable_step_logs」パラメータを調整することで、アーティファクトストアにログの保存を有効化または無効化することができます。これの使い方を見てみましょう:
#ここでは、パラメータとしてログを無効化しています。@step(enable_step_logs=False)def sample_step_2(input_1: str, input_2: str) -> None: print(input_1 + " " + input_2)
出力:
ログ出力前:
ログ出力後:
設定のタイプ
ZenMLには2種類の設定があります:
- 一般設定:これらの設定はすべてのパイプラインで使用することができます(例:Docker設定)。
- スタックコンポーネント固有の設定:これらは実行時の特定の構成設定であり、これはスタックコンポーネントの登録設定とは異なります。登録設定は静的であり、これらは動的です。例えば、「MLFlowTrackingURL」は登録設定であり、実験名とそれに関連する実行時の設定はスタックコンポーネント固有の設定です。スタックコンポーネント固有の設定は実行時に上書きすることができますが、登録設定はできません。
モデルの時刻スケジュール
cronジョブを使用して、MLモデルのデプロイを特定の時刻にスケジュールできます。これにより時間を節約し、指定された時刻にプロセスが遅延することなく実行されるようになります。以下に設定方法を説明します:
from zenml.config.schedule import Schedulefrom zenml import step,pipeline#ステップを定義し、文字列を返す@stepdef sample_step_1()->str: return "Welcome to"#2つの入力を受け取り、出力を表示する@stepdef sample_step_2(input_1:str,input_2:str)->None: print(input_1+" "+input_2) @pipelinedef my_first_pipeline(): logger.info("Its an demo project") input_1=sample_step_1() sample_step_2(input_1,"Analytics Vidya")#cronジョブを使用してパイプラインをスケジュールします。schedule = Schedule(cron_expression="0 7 * * 1")my_first_pipeline = my_first_pipeline.with_options(schedule=schedule)my_first_pipeline()
この場合、CRONジョブの式は(分、時、月の日、月、週の日)の形式に従います。ここでは、パイプラインを毎週月曜日の午前7時に実行するようにスケジュールしました。
あるいは、時間間隔を使用することもできます:
from zenml.config.schedule import Schedule
from zenml import pipeline
@pipeline
def my_first_pipeline():
input_1 = sample_step_1()
sample_step_2(input_1, "Analytics Vidya")
# 現在の時間を指定するためにdatetime.now()を使用し、
# 定期的に実行する必要のある時間間隔をinterval_secondパラメータで指定します。
schedule = Schedule(start_time=datetime.now(), interval_second=3000)
my_first_pipeline = my_first_pipeline.with_options(schedule=schedule)
my_first_pipeline()
現在の瞬間から開始し、5分ごとに繰り返すようにパイプラインを初期化するためのコードを書きました。
ステップコンテキスト
ステップコンテキストは、現在実行中のステップに関する情報(名前、実行名、パイプライン名など)にアクセスするために使用されます。この情報は、ログ記録やデバッグの目的に役立ちます。
# 必要なモジュールをインポートする
from zenml import pipeline, step
from zenml.client import Client
from zenml.logger import get_logger
from zenml.config.schedule import Schedule
from zenml import get_step_context
# 現在のモジュールのためのロガーを取得する
logger = get_logger(__name__)
@step
def sample_step_1() -> str:
# ステップ関数内でステップコンテキストにアクセスする
step_context = get_step_context()
# パイプライン名、実行名、ステップ名を取得する
pipeline_name = step_context.pipeline.name
run_name = step_context.pipeline_run.name
step_name = step_context.step_run.name
logger.info("パイプライン名:%s", pipeline_name)
logger.info("実行名:%s", run_name)
logger.info("ステップ名:%s", step_name)
logger.info("これはデモプロジェクトです")
return "ようこそ"
@step
def sample_step_2(input_1: str, input_2: str) -> None:
# 2番目のステップ関数でステップコンテキストにアクセスする
step_context = get_step_context()
# パイプライン名、実行名、ステップ名を取得する
pipeline_name = step_context.pipeline.name
run_name = step_context.pipeline_run.name
step_name = step_context.step_run.name
logger.info("パイプライン名:%s", pipeline_name)
logger.info("実行名:%s", run_name)
logger.info("ステップ名:%s", step_name)
print(input_1 + " " + input_2)
@pipeline
def my_first_pipeline():
input_1 = sample_step_1()
sample_step_2(input_1, "Analytics Vidya")
my_first_pipeline()
出力:
結論
この包括的なガイドでは、ZenMLのインストールから実行順序のカスタマイズ、タイムスケジュールの作成、ステップコンテキストの利用など、ZenMLに関するすべての情報を網羅しました。これらの概念により、より効率的なMLパイプラインを作成し、MLOpsの旅をよりシンプルかつスムーズにすることができることを願っています。
キーポイント
- ZenMLは、@stepや@pipelineのようなデコレータを使用して、MLパイプラインの作成を簡素化することで、初心者にもアクセスしやすくしています。
- ZenMLのダッシュボードは、パイプライン、スタックコンポーネント、アーティファクト、実行の追跡を容易に行い、プロジェクト管理を効率化します。
- ZenMLはWeights & BiasesやMLflowなどの他のMLOpsツールとシームレスに統合され、ツールキットを強化します。
- ステップコンテキストは、現在のステップに関する貴重な情報を提供し、効果的なログ記録やデバッグをサポートします。
よくある質問
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles