ブログを久しく更新していなかったので、今日は日曜日ということではないですが(宍戸さん毎日日曜日と言われている)PythonでAIプログラミングをする際の開発環境について考察してみようかなと思いました。SwiftUIにAIモデルを移植するとい言う話はまだ先のことになりそうです。当面は元のAIプログラミング開発環境ということについて現在私が使っているシステムを紹介しながらダラダラブログしようかなと思います。
過去の変遷
当初AIプログラミング学習始めた頃(2020年5月)は、まず、AWSでクラウドプログラミングをできるようになりたいという希望もあり、Cloud9を使ってPythonのScikit learnのコードやDjangoのWebアプリを実装することから始めました。そもそもAWSのシステムを知らなかったのでIAMて何?ポリシーとロールはどう違うの?Security GroupのOutboundとInboundのポート設定って何?とかお笑い状態でしたね。でもネットワークセキュリティーとかAWSのシステム知らない人にとってはやはり僕と同じで「それ何?」って思う人もいると思います(そう信じたい。大体EC2て何と思っていた)。
しばらくしてCloud9での実行環境から、SageMakerStudio環境に移行して、Tensorflow、Keras、 Pytorchを使ったPythonのコードを走らせて既存のAIプログラミングのアルゴリズムを実行したり、既存のデータセットを読み込んでAIモデルをトレーニングし始めました。SageMaker環境に移って初めてGPUを使ったトレーニングを実行しました。非常に快適は快適であったのですが、問題は「懐(ふところ)」でした。例えば、GPUを使ったトレーニングを1日まわすと結構なお小遣いがなくなります。もう一つの問題は、AIを実装するDjangoをDockerを使って実行検証するのがめんどくさいということでした。
現在の環境
そこで「懐(ふところ)」に優しく、アウトプットのUI部分をDockerを使って簡単に検証する方法を確立する必要がありました。これが最善ということはわかりませんが、現在のシステムはlocalでVSCodeを使って、 Dockerを使用してDjangoでAIプログラミングのUI部分を検証することです。AI プログラミングのトレーニング部分は現在GoogleColabのGPU環境で実行しています。そして、本番環境は、AWSのEC2インスタンスにlocalのDockerイメージをAWS のECRリポジトリを介して導入し、EC2のDocker環境(Docker-compose)でpull, build, upしてデプロイしています。実際のVSCodeの作業です。
VScodeはDockerのプラグインがあり、Docker導入後にPluginを使ってコンテナの状態を確認したり、コンテナの中に入って作業をすることができ非常に便利です。実際にコンテナを走らせた図を下に示します。
これをGoogle ChromeでUIを検証します。その際にHTMLのソースコードを表示しながら画面編集するといいですね!UIの検証はChromeが優れている気がしています。
GoogleColabでのAIトレーニングはまたの機会にブログで紹介しますね。
これでlocalでAIプログラミングを実装したDjangoが完成したとします。では、これをどのようにデプロイするかですね。無料でHerokuの枠を使うやり方はいろいろネットでググれば出てきますし、Udemyのコースでも取り上げられていますね。
今日紹介するのはAWSで将来クライアントができた際にも種々応用できるやり方になると思います。用途に応じてAWSのEC2もいろいろ選択したいと思います。ですので、一般的に汎用性が高いのではないかと思うやり方を紹介します。
localのデバッグ環境はDockerのイメージによるものです。ですので、Docker-composeを導入できる環境であればどのようなAWSクラウド環境でもデプロイが用意で且つ更新もほとんどバッチ処理できるものがいいと思いました。
私が採用しているのは多分AWSのSageMakerの導入と同様に、AWSのECRプライベートリポジトリにDockerイメージを登録して、目的のEC2インスタンスのDocker環境からpull、build、upしてほぼワンクリックでデプロイが終了するというものです。
まずは、AWSのCLIをlocalに導入し、ECRにもloginする必要があります(ネットでググればやり方は書いてあります)。そして、localで作成したDockerImage(本ケースでは、s3poller, img2xml, saaipf(django)の3つのイメージ)をECRに登録します。
#! /bin/bash TAG_S3POLLER=s3poller:prod TAG_IMG2XML=img2xml:prod TAG_SAAIPF=saaipf:prod pushd s3poller bash build.sh popd docker tag ${TAG_S3POLLER} AAAAAAAAAAAAAAA.dkr.ecr.ap-northeast-1.amazonaws.com/${TAG_S3POLLER} docker push AAAAAAAAAAAAAAA.dkr.ecr.ap-northeast-1.amazonaws.com/${TAG_S3POLLER} pushd img2xml bash build.sh popd docker tag ${TAG_IMG2XML} AAAAAAAAAAAAAAA.dkr.ecr.ap-northeast-1.amazonaws.com/${TAG_IMG2XML} docker push AAAAAAAAAAAAAAA.dkr.ecr.ap-northeast-1.amazonaws.com/${TAG_IMG2XML} pushd saaipf bash build.sh popd docker tag ${TAG_SAAIPF} AAAAAAAAAAAAAAA.dkr.ecr.ap-northeast-1.amazonaws.com/${TAG_SAAIPF} docker push AAAAAAAAAAAAAAA.dkr.ecr.ap-northeast-1.amazonaws.com/${TAG_SAAIPF}
これでECRにDockerイメージは登録できたので、目的のEC2にSSHでloginして、そこからDocker-composeでpull, build, upするshファイルか何かをbashで動かすとほぼワンクリックでデプロイと更新が完了です。
PythonでAIプログラミングをするのはその解析や実行部分だけでなくアウトプットのUI部分のやり方を工夫すると「もっとエンジョイできる」ような気がしています。
コメント