はじめに
機械学習エンジニアは誰だって無限の計算資源を欲している・・・そうだろ? こんにちは。ABEJAでMLOps Engineerをしている服部です。こちらはABEJA Advent Calendar 2019の5日目の記事です。今回は機械学習エンジニアが欲してやまない「様々なコンフィグレーション機械学習Jobを無限に投げる」方法について紹介します。ABEJA Platformを使うとJupyter Notebookでデータ分析をしながら、任意の特徴量やハイパーパラメータを使う機械学習Jobをポンポンと投げることができるんです。早速紹介しましょう。 ※ただしお金はかかります
動画
[embed]https://youtu.be/EIknYR6SOyc[/embed]
解説
動画の要点だけ解説します。
前置き
ABEJA PlatformにはJupyter Notebookの機能があります。最近のアップデートでJupyterLabも使えるようになりました。
ABEJA Platformにはいくつか機械学習テンプレートがありまして、今回のデモではlightgbmのテンプレートを使用しています。
Jupyterのターミナルでlightgbmのテンプレートを git clone
します。lightgbmのテンプレートには train_notebook.ipynb
が含まれているので、そちらを起動します。
ABEJA Templateを利用すると、学習データの読み込みからモデリングまでノンコーティング実行できるので良いですね。当然、Notebookなのでガンガンとデータ分析のコードも追加できます。機械学習エンジニア/データサイエンティストの皆様はNotebookでデータを可視化&分析しつつ「俺が考えた最強の特徴量」を追求してください。
特徴量エンジニアリングが終わったら、コードがちゃんと動作するか確認します。実際に学習を回してみて数エポックが正しく動作するか確認しましょう。エポック毎にちゃんとlossが下がっているかもちゃんと確認しましょう。プログラムにバグがないか、学習はちゃんと進んでいるか、それらを確認したらようやく本題に入ります。
本題
ここまでが前置きです、ここから本題に入ります。
Jupyterで十分デバッグが出来たら、いよいよ夢にまで見た「様々なコンフィグレーション機械学習Jobを無限に投げる」をやるときが来ました。ここまでに使った ipynb
をABEJA Platformに登録し、様々なコンフィグレーションを試行錯誤してみましょう。ここで注意点ですが、変更したいコンフィグレーションは環境変数で指定できるようにソースコードを構成しましょう。それさえ守っていただければ夢の実現はすぐそこです。
さて、まずは ipynb
をABEJA Platformに登録可能な形式に変換しましょう。lightgbmのテンプレートを使っている場合、やることは簡単です。ipynbのセルを実行してpythonファイルに変換するだけです。テンプレでは学習に不要なコードはpythonファイルに含めないようにしてあります。
ipynbをpythonファイルに変換したら、ファイルの実行に必要なソースコードを全部まとめてABEJA Platformにアップロードします。アップロードはABEJA SDKを使って簡単に出来ます。下の図の通り、 _files
に必要なファイルのファイルパスを書くだけです。
実際のアップロードはこちらのコードで行います。description
は自由記入欄です。後で見て分かりやすいように、適切なメモを書くようにしましょう。image
はcontainer imageです。ABEJA Platformでは利用できるimageが定められていますので、そちらをセットするようにしてください。handler
とenvironment
についてはテンプレでは自動で埋めるようにしてあるので今は気にしなくてOKです。
version = api.create_training_job_definition_version(
organization_id=_organization_id, job_definition_name=_job_definition_name, filepaths=_files,
handler=_handler, image=_image, environment=_environment, description=_description)
上記のコードを実行することで、ABEJA Platformにソースコードのアップロードが出来ました。
いよいよ機械学習Jobを発行するときです。機械学習Jobの発行はABEJA SDKの以下のコマンドから出来ます。コンフィグレーションは環境変数で与えるという制約があるので、user_parameters
を使って環境変数をセットします。user_parameters
に指定されたkey-valueが機械学習Jobの環境変数としてセットされるのです。使える環境変数はprefixがABEJA_
以外なら何でもOKです。
一番イメージしやすい試行錯誤は「ハイパーパラメータチューニング」でしょう。ハイパーパラメータの値をuser_parameters
にセットすれば、そのパラメータで学習Jobを回すことができます。オススメの使い方は、「特徴量エンジニアリングの過程で作ったたくさんの特徴量に対して、使う特徴量を環境変数で指定する」という使い方です。この方法なら特徴量エンジニアリングの試行錯誤を一気にたくさん実施できます。以下の例ではlightgbmのmax_depth
を変更しました。lightgbmのテンプレで利用できるハイパーパラメータはこちらにまとめてあるので参照してください。
from abeja.train.instance_type import InstanceType
user_parameters = {
'MAX_DEPTH': '3'
}
instance_type = InstanceType.GPU_A1.value
job = api.create_training_job(
organization_id=_organization_id, job_definition_name=_job_definition_name,
version_id=version['job_definition_version'], user_parameters=user_parameters,
instance_type=instance_type)
上記のコードで機械学習Jobをポンポンと投げると、下図のようにABEJA Platform上で機械学習Jobが実行されます。 どうです?めちゃくちゃ作業が捗りそうでしょう? 当然、ABEJA PlatformでCPU/GPUは使い放題というわけではなく、使用量に基づく課金があります。・・・が、Jobは終了したら自動的にインスタンスを落としてくれるので、使った分だけが課金される仕組みです。安心ですね! ※ただしプログラムの品質はお客様次第
おわりに
今回はABEJA PlatformのJupyter Notebookを使って機械学習Jobをたくさん投げる方法について紹介しました。ABEJA Platformは機械学習に特化したフルマネージドなインフラなので、インフラの管理をしたくない機械学習エンジニアのみなさんにとってはとてもありがたいプロダクトだと思います。明日は「学習済みの機械学習モデルの管理なんてもうしたくない」という方にピッタリの機能(2019/12/5時点では公式非推奨)を紹介します。お楽しみに。