えんじにあのじゆうちょう

勉強したことを中心にアウトプットしていきます。

ServerlessなKubernetes上で機械学習タスクを実行してみる

はじめに

だいぶ間が空いてしまいました。(コロナとかではなく、ネタ切れです)
今回はAlibabaCloudのServerless k8sサービスでGPUが使えるっぽいというのをドキュメント上確認したので試してみた、ということを書きます。

Serverless k8sを使うメリット

Serverless k8sを使うメリットはとても単純で、「実行時以外お金がかからない」という一点がとても大きいと考えています。
お金がある人は、普通のk8sサービス使って、GPUインスタンスも立てまくっておけば別にいいと思いますが、GPUインスタンスは最低でも月々80,000円/台くらいしたはずで個人利用や予算のあまりないチームで使い続けるには中々厳しいものがあると思います。
この課題はECS(Preemptive使ったり)のようなIaaSサービスをうまいことプロビジョニングしてやれば十分解決できるのですが、自前で書くとまぁバグを作り込んでしまって正しく終了できないで高額請求と行ったことも考えられます。
Serverless k8sを利用することでk8sなのでjobのyamlさえしっかり書いてあげさえすれば非常に簡単にコード化できるので、CICDパイプラインに組み込んだりすることも容易ですね。
とにかく使わない手はないと思っています。

やってみた

購入とkubectlの設定

購入は画面からポチポチで非常に単純なのでドキュメント貼っておきます。試した感じだと3分くらいで完成します。
www.alibabacloud.com

作ったら.kube/configに相当するものがダウンロードできるようになるので、ダウンロードして設定しておきましょう。
www.alibabacloud.com

学習用コードを書く

とりあえず学習はなんでもいいやーということで、以下のtensorflow公式にあるfashion mnistチュートリアルのものを使います。
www.tensorflow.org

最終的に1枚のpyファイルに纏めて、こんな感じになりました。
gitlab.marufeuille.dev

ローカルで実行してみるとわかるのですが、このくらいのタスクだと待てないほど遅いわけではないですが、1 Epochごとにそこそこ時間かかっちゃってるなぁ、という感じですね。

Job(yaml)の作成

いままでDeploymentくらいしか書いたことなかったのですが、今回初めてJobを書きました笑
gitlab.marufeuille.dev

ポイントは2箇所です。

1点目は以下のようにgpu搭載のインスタンス上で動くようなアノテーションを付けることです。

      annotations: 
        k8s.aliyun.com/eci-instance-type: "ecs.gn5-c4g1.xlarge"

www.alibabacloud.com


その他、使えるアノテーション類は以下にまとまっています。
www.alibabacloud.com

2点目はリソースで以下のような設定をいれるところです。

          limits:
            nvidia.com/gpu: '1'

実行

それでは準備が整ったので実行していきましょう。コードはすべて途中でも貼っている以下リポジトリにあげてあります。

gitlab.marufeuille.dev

クローンして実行します。

git clone https://gitlab.marufeuille.dev/masahiro.ishii/awesome-tf-mlops/
cd k8s
kubectl apply -f trainer.yaml

はい。これで終わりで完了を待つだけです。

状況はコンソールで見たり、

kubectl get pods

とかで見れるはずです。

完了するとこんな感じになるはずです。

f:id:marufeuillex:20200802053433p:plain

お金について

さて。冒頭でお金あまりかからないという話をしましたが、実際にどうだったのか見ていきましょう。
残念ながら、AlibabaCloudの公式ページ上ではどの課金が該当するのか特定することはできませんでした。
そのため、結果(請求額)から遡ることにします。

f:id:marufeuillex:20200802054025p:plain

なおこれは、1回分の実行ではなく他の練習含めて数回分まとまってしまっています。

そんなわけで請求額は$0.889000だったわけですが、今回指定したgn5-c4g1.xlargeは以下価格表を見ると、時間単位でこんな課金でした。

f:id:marufeuillex:20200802055951p:plain
(最新版はこちらより)

定価は$1.821/hourなので、請求額の$0.889のほうが小さいと考えると、おそらく秒 or 分単位で課金されているように見えます。
(たぶんECIの課金単位である秒なのでしょうが、要確認です)

今回はapt updateやapt installもコンテナ起動時にやるようにしていたので、やや無駄な時間がかかっています。
このあたりを事前にビルドするなどしてコンテナレジストリに突っ込んでおけばそのあたりも短縮化されて、より効率よく利用できると思います。

最後に

今回はServerless k8s + GPUを利用して機械学習の学習を実施してみました。
GPUは高いので学習時のみ購入というのを考える方も多いと思いますが、API叩いていると少しめんどくさい・・・ということもあるかと思います。
その点、多少yamlに慣れる必要があるとはいえk8sの標準化された記述の中で実行できるというのは中々いいかもしれません。