センシンロボティクスのAIマネジャー、ジェイクです。
ほとんどQiitaで投稿しないが、どうぞよろしくお願いします。
自分のキャリアの中で「いいソフトウェアエンジニアは怠け者」というアイディアを何度も聞いたことある。元々言い出したのはのはPerlの生みの親、Larry Wallだそうですが、ここでいう怠け者は 「何度も同じ作業を繰り返したくないこと」 を示している。例えば、名前の配列をプリントしたい時に
print(names[0])
print(names[1])
print(names[2])
みたいに項目ごとにプリントを書くことは不効率です。それより配列をループしたら、print を一度だけで済んで、わりと簡潔に書ける。これこそLarry Wallが望んでいる怠惰だろね。
もちろんセンシンロボティクスでも日々より怠け者((=効率的))な働き方を目指しているが、最近中々運が良くてAzure Machine Learning Studioで余計な繰り返し作業を減らすことができた。Azure Machine Learning Studio (以上Azure MLと省略しとく)はMicrosoftさんが提供する機械学習プラットフォームで、MLジョブ、パイプラインやメトリック可視化などの便利な道具をたくさん提供している。その上、自分のスクリプトを簡単に組める便利なSDKも提供してくれている。面倒な繰り返し作業を自動化するには完璧な環境。
では、ここまできて具体的にどのようにAzure MLを使って怠け者になれる?可能性は無限だけど、まずセンシンロボティクスで実施されている実に怠惰な実装を紹介しましょう。
MLワークスペースのコンフィグフォルダ
Azure MLを使ったことがある読者は以前ワークスペースの config.json をダウンロードしたことあるかもしれないが、このコンフィグファイルにはワークスペースのサブスクリプションIDなどの情報が入っている。この情報を使ってSDK経由でワークスペースとやり取りできる。これはこれで便利なんだけど、毎回SDKにパスするのがやっぱりそういう避けたい繰り返しタスクなんだよね。
センシンロボティクスでは、ワークスペースコンフィグフォルダを作って、そこに全てのコンフィグファイルを放り込んでいる。各ファイルの名前をワークスペースと同じ名前にしている。そしたらSDKを実行するスクリプトでファイルパスじゃなくて、比較的に覚えやすいワークスペース名を渡せば良い。スクリプト側でワークスペースコンフィグフォルダにその名前のファイルを引っ張ってこれるから楽。
ただ、そこだけで止まらないよ。それぞれのプロジェクトに統一したYAMLファイルを作って、そこでプロジェクトが使うワークスペースの名前を書いている。
workspace: "my_awesome_workspace"
そうするとジョブを実行するスクリプトにフォルダを教えるだけでワークスペースと実行すべきコードは自動的に用意される。時間短縮以外、このやり方をするとどのプロジェクトがどのワークスペースを使用しているかをgit repoなどから簡単に確認できる。
名付けて:トレーサブル怠け者 ![]()
役に立つ情報をタグして簡単に検索
今のセンシンロボティクスAIチームには何人かがいて、毎日モデルを学習し、推論をかけて、モデルを評価している。そうするとワークスペースのジョブ歴がとんでもなく大きくなる。Azure MLはジョブをExperimentでフィルタできるので、ある程度絞れるんですが、それでも検索が困難な時は少なくないんだよね。
幸いなことにAzure MLにはタグというメタデータのような概念があります。モデルやデータセットにタグをつけることができ、もちろんジョブにもタグをつけられる。タグで検索することやタグの値がある数値以上あるいは以下などで絞ることも可能。ただ、ここで気をつけないといけない:単純に手動タグをつけることは怠け者がすることではない。重要なのは自動的につけることだね。
ジョブで使われている環境の中にAzureのライブラリをインストールするとジョブの情報を取得し、ジョブの中からタグをつけることが可能。センシンでは、社内AIライブラリにタグつける機能を追加し、すべての学習ジョブに最大のメトリック値、モデル種類(物体検知など)やONNXエクスポートが成功したかどうかをタグづけしている。そしたらフィルタが楽になる。そしたら「0.65以上のIoU + インスタンスセグメンテーション」などで検索できたりする。どう?めちゃくちゃ怠け者じゃない?
メトリック記録モジュールを作る
リストの最終項目に辿り着いた。この時点では、読者の皆さん大体イメージついているかと思うけど、もう一個とっておきのLazy Trickを教える。AI業界では、メトリックはすべて。一つのモデルに対して十数メトリックあってもおかしくないぐらいだよね。どのプロジェクトでもそのメトリックをどうトラッキングするのを決めないといけないし、世の中トラッキング向けのライブラリもたくさんある。
Azure MLのいいところは、中にはすでにMLflowが組み込まれて、ジョブの中でMLflowにメトリックを投稿したらGUI側でメトリックページに表示される。ある意味でMSが我々の怠け者さを応援してくれているようなことで感謝している。ただ、そこで気を緩んじゃダメだよ。その先に本物の怠惰が宿っている。
センシンは、社内フレームワークの中にそれぞれのモデルのメトリックを自動的に拾い、MLflowに投稿する機能を追加した。そうすると新規プロジェクトでも継続プロジェクトでも学習を回すとメトリックは自動的にジョブGUIに追加される。怠惰ですねぇ〜
まとめ
では、怠惰な仲間たち、ご覧の通りAzure MLは素晴らしく怠惰な環境である。もし自分のチームの中でもさらなる怠惰を目指しているなら、ぜひセンシンロボティクスの怠け者さをインスピレーションにして自分の仕事を楽にする機能をどんどん作ってみてください!