OpenShift Source-to-Image (S2I)を使用してAI推論のCI/CDを試す

本記事ではOpenShift Source-to-Image (S2I)を使用してAI推論のCI/CDを試してみた時の手順を紹介します。
今回はAIモデルの学習・検証・モニタリングといったMLOps要素を含まずシンプルな推論アプリのCI/CDをOpenShift　S2Iを使用して試してみました。OpenShift S2IはGitHub上などにあるソースコードからDocker形式のコンテナイメージをビルドしてOpenShift上にデプロイが可能なツールで、お手軽に推論アプリをOpenShift上に作成することが可能となっています。
AI推論は学習済みモデルを使用したTensorflow/Kerasによる画像分類をサンプルとして使用し、以下のGitHub上のソースコードからOpenShift上に推論アプリをデプロイします。
https://github.com/mmitsugi/ic-sample

なお、別途OpenShift Pipelinesを使用した同AI推論のCI/CDも試しており、[別記事](https://qiita.com/mmitsugiw/items/e1e7c0624dd21ce65372)にて記載しています。

OpenShiftはx86サーバー上のCodeReadyContainers(CRC)を使用しています。またIBM PowerサーバーのSingle Node Cluster上でも動作可能です。IBM Powerサーバーの場合はGitHubのブランチにppc64leを指定してS2Iを使用する必要があります。

# AI推論アプリの構成
GitHub上にも記載がありますが、今回使用するAI推論アプリの構成は以下となります。
![](https://github.com/mmitsugi/ic-sample/raw/main/doc/images/architecture.png)
Flaskを使用したPythonアプリとなり、GitHubのレポジトリにFlaskのソースapp.pyとアプリで使用するPythonパッケージをrequirements.txtに追加しておくことでOpenShift S2Iが自動で認識してくれてビルド、デプロイまでを行ってくれます。

# プロジェクトの作成およびS2Iビルド
今回はOpenShiftのWeb Consoleからの操作を行いました。
S2Iビルドを行うユーザーでWeb Consoleにログインし、Administratorパースペクティブでホーム->プロジェクトを選択後、"プロジェクトの作成"ボタンをクリックしてプロジェクトを作成します。今回は"ic-s2i"という名前のプロジェクトを作成しました。
![project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/5a3cddc7-0e4a-bd3f-8e59-611dec84e087.png)
その後パースペクティブをDeveloperに変更して、
![perspective_change.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/64969636-4b3d-dba4-85f7-91625b465af8.png)
"+追加"を選択します。この際プロジェクトが対象のプロジェクト"ic-s2i"になっているか確認し、なっていなければ変更します。
![add.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/c7ba913c-d029-d292-77da-20eac7f39a5e.png)
このページから"Gitからのインポート"を選択します。
![git.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/0522661a-e93f-4174-5f3c-cbc85b09ac8b.png)
GitレポジトリーURLに
https://github.com/mmitsugi/ic-sample.git
を指定すると以下のようにBuilder Image(S2Iビルドのベースとなるイメージ)が自動検出されます。
![git repo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/b5d24965-b8ab-3df3-a341-e5e0cde939f1.png)
"一般"の項目にある"アプリケーション"を"ic-sample-app"、"名前"を"ic-sample"に変更して、"作成"ボタンをクリック
![general.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/76020c4b-4582-f16a-eb5e-78a235c21997.png)
すると自動的にトポロジーページに移り以下の画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/a3a2be88-6b28-1cdf-7640-e853ffe84626.png)
この"ic-sample-app"の砂時計マークがS2Iビルドがなされていることを表しており、こちらをクリックするとビルド状況が表示されます。(別途ビルドページからも参照可能です)
ビルドが完了すると以下のようにcompleteのステータスとなります。
![build complete.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/ead4d5e3-84de-8c6c-e9d5-96b2c0556a8f.png)

# AI推論アプリの実行
トポロジーページにあるアプリケーションの"URLを開く"をクリックします
![topo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/e88ad5a5-5e5d-c3f5-d6e0-961a637a5058.png)
以下のようにAI推論アプリが立ち上がり、分類したい画像ファイルのアップロードで画像分類が実行できます:smiley_cat:
![ai_inference.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/9dfc3aa6-edfc-328d-354e-c8c9babda923.gif)

# OpenShift S2Iに関する補足
上記の手順にあげた通り、S2Iを使用すると以下のパイプラインタスクが自動化され、簡単にGitHub上のコードをOpenShiftにデプロイすることが可能です。
* GitHubからのコード展開
* Builder Imageによるイメージビルド
* Registryへのイメージ保存
* OpenShift上へのデプロイ
![](https://cloud.redhat.com/hubfs/Imported_Blog_Media/S2IDeveloperWorkFlow1.png)
参照リンク: https://cloud.redhat.com/blog/source-image-s2i-deep-dive-ben-parees-openshift-commons-briefing-43

今回は初期ビルドのみを試してみましたが、GitHubにてWebHookによるトリガー設定を行うことにより、GitHubの変更をトリガーとしてイメージビルドおよびアプリケーションのデプロイを行うCI/CDを実現することも可能です。WebHook設定のURLは以下のようにOpenShift Web Console上のビルドページから"ic-sample"を確認し、同ページ内のGitHub WebHook設定内の"シークレットの使用によるURLのコピー"にて取得できます。
![bc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/036dcef1-3b44-4ec2-39f1-8d44166c2584.png)
![webhook.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/31571d0e-a3ed-04bf-7ba2-69b478d93421.png)
GitHub上でのWebHookの設定などの詳細は下記のOpenShiftのマニュアルに詳細があります。
https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.9/html/cicd/triggering-builds-build-hooks#builds-using-github-webhooks_triggering-builds-build-hooks

以上、OpenShift S2Iを使用してAI推論のCI/CDを試してみました。今回はシンプルな例を試してみましたが、自動テストをビルドに組み入れるなどのカスタマイズも可能となります。また別記事にて、S2Iではなく[OpenShift Pipelinesを使用した例](https://qiita.com/mmitsugiw/items/e1e7c0624dd21ce65372)も紹介しています。より細かい制御を行いたい場合などはこちらを参照していただくのがよいかもしれません。