リンクバルの磯谷です。
またDeepLensに関して記事を書かせていただきます。
今回はコミュニティプロジェクトのデプロイ編です。
今回も基本的には公式説明に依ります。ですがこのページは完全オリジナルなプロジェクト(学習部分も自分たちで行う)をベースに書かれています。コミュニティプロジェクトをデプロイし、学習部分以外をいじるだけならもう少し簡単にいけますので、今回はそのショートカット版のご紹介です。
目次
コミュニティプロジェクトのデプロイ
大まかに以下のような手順です。(S3→DeepLens→Lambda→DeepLens)
- S3コンソールでバケット作成、ファイルの配置
- DeepLensコンソールでモデルのインポート
- Lambdaコンソールで関数とGreengrassの設定
- DeepLensコンソールでデプロイ
S3コンソールでバケット作成、ファイルの配置
まずはS3のコンソールに入ります。
「Create bucket」を押して新しくバケットを作成します。注意点は、作成するバケット名を「deeplens-sagemaker-」から始めることです。(画面ショットで黒塗りにしてあるところが該当。)
※「region」については、日本でもOKのような気もしますが念のため「US East (N. Virginia)」にしています。公式説明の「Make sure you are in the US East (N. Virginia) region.」「Verify that you are in the US East (N. Virginia) region.」という文をどのように解釈するか。。regionを日本にして実験した方がいたら教えていただけると幸いです。
名前とregionの確認をしたら、右下の「Next」を押します。
次の「Properties」の設定画面は何もせずそのまま「Next」でOKです。(画像省略)
次の「Permissions」の設定画面では、「Objects」と「Object permissions」の両方とも、「Read」「Write」権限がチェックされていることを確認して「Next」を押してください。
次の確認画面で設定を確認し、問題なければ「Create bucket」を押してください、元の画面に戻ります。(画像省略)
なお、上記の設定はデフォルトでなされているため、名前とregionを設定したら、そのまま「Create bucket」でも大丈夫そうです。
バケットが作成されていることを確認しクリック、「Permissions」タブを押し、「Public access」の「Everyone」の前にある丸ボタンをクリックしてください。
すると右側にポップアップが出ます。ここのチェックボックスは4つとも全て選択して「Save」を押してください。
元のページに戻り作成したバケットを再度選択、「Overview」タブから「Create folder」を押します。
「test」という名前にしたら「Save」を押してください。チェックは特にいじらなくて大丈夫です。(画像省略)
この「test」フォルダに「xxx.params」「xxx.json」ファイルを置きます。
まずはコミュニティプロジェクトからお好きなプロジェクトをダウンロードしてください。私は「deeplens-asl」のgithubをローカル環境にクローンしました。
「deeplens-asl」の例でいうと、「models」の中に「deeplens-asl-0000.params」と「deeplens-asl-symbol.json」がありますので、これを先ほど作成した「test」フォルダにそのまま置いてください。「Upload」を押してファイルを選択すればOKです、途中権限の設定等ありますが、基本デフォルトのままで大丈夫です。アップロードに1分程かかりました。
S3コンソールでの作業は一旦終わりです。次はDeepLensのコンソールで作業します。
DeepLensコンソールでモデルのインポート
今度はDeepLensのコンソールに入ってください。
左ペインの「Models」を選択、右側にある「Import model」を押してください。
「Import source」は「Externally trained model」を選択してください。
次は「Model settings」の設定です。
「Model artifact path」は先ほど作ったバケットにある「test」フォルダを指定してください。
「Model name」はお好きな名前にしてください。
「Model framework」はご自身が選んだプロジェクトのフレームワークに合わせてください。(フレームワークのスマートな確認方法は私も試行錯誤中です。。公式説明だとここの説明がないんですよね。ひょっとして選択しなくても次へ進むことができる?コミュニティプロジェクトの「facial_emotion」は学習用のコードがありMXNetだということがわかりますが、「deeplens-asl」は学習用のソースが公開されていないので何が正解なのかは定かではありません。)
「Description」は任意で入力してください。
お疲れ様です、でも作業はまだ続きます。次はLambdaコンソールで作業していきます。
Lambdaコンソールで関数とGreengrassの設定
まずはコンソールからLambdaにアクセスしてください。
左ペインの「Functions」から「Create function」を押してください。
「Blueprints」を選択したら、「Add filter」から「greengrass-hello-world」を検索、選択してください。画像はキーワード「hello」で検索した時の様子です。
右下の「Configure」を押していただくと、↓のような画面になります。「Name」はお好きな名前を、「Role」関連は適当なものを選択して下さい。場合によってはIAMで権限を作成したりする必要があるかもしれません。私は以下のように設定しました。準備ができたら、右下の「Create function」を押して下さい。
すると次のような画面になります。せっかく作った「greengrassHelloWorld.py」ですが、その内容を丸々入れ替えます。先ほどダウンロードしていただいたコミュニティプロジェクトからlambda関数を探して、その中身をコピー、今作った「greengrassHelloWorld.py」を丸々上書きして下さい。画面ショットは上書き前の様子です。なお、「deeplens-asl」の場合、「lambda」フォルダの下に「greengrassHelloWorld.py」があるので、それを使って下さい。
コピペが終わったら、右上の「Save」を押したのち、「Actions」の「Publish new version」を選択することを忘れないで下さい。何か修正するたびに、「Save」→「Publish new version」を忘れないようにして下さい。
注)「丸々上書き」と書きましたが、選んだコミュニティプロジェクトによっては一部コードを変更しなければならない場合もあるかと思います。あるいは「xxx.json」「xxx.param」のファイル名を変更して、そのファイル名が「greengrassHelloWorld.py」に直打ちで指定されている場合も該当するかと思います。臨機応変に対応をお願いします。
これで関数は作成できました。再びDeepLensのコンソールに戻り、デプロイをして完了です。
DeepLensコンソールでデプロイ
まずはDeepLensのコンソールに入ってください。
以下の作業はサンプルプロジェクトのデプロイと大まかな流れは一緒です。左ペインの「Project」から「Create new project」を押して下さい。サンプルプロジェクトのデプロイの際は「Use a project template」を選択しましたが、今回は「Create a new blank project」を選択、「Next」を押して下さい。
「Project name」に好きな名前を入れ、「Add model」「Add function」から先ほど準備したモデルと関数を選択して下さい。準備ができたら「Create」を押して下さい。
この後の流れはサンプルプロジェクトのデプロイと同じです。今作ったプロジェクトを選択して「Deploy to device」、対象のデバイスを選択して「Review」「Deploy」を押せばOKです。
OKなはずなのですが、なぜかデプロイに失敗しました。5分ほど進捗0%で次のような画面に。
ネットで見つけた記事をもとに、SSHでデバイスに入り以下のコマンドを実行。
[bash] sudo systemctl restart –no-block greengrassd.service[/bash]
再度デプロイしたら、無事成功しました!
終わりに
みなさんお疲れ様でした!今回のエラーは割と簡単に解決しましたが、もっと複雑なものになると、予期せぬエラーが頻発しそうです。(IAMロール関連など特に。)
DeepLens関連のブログはいったんおやすみするかもしれませんが、これからも備忘を兼ねて色々アップしていけたらと思っています。
弊社はいろいろなことにチャレンジしたいエンジニアを募集中です。興味のある方はこちらからご連絡をお願いします。