はじめに
だいぶ間が空いてしまいました。(コロナとかではなく、ネタ切れです)
今回は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
2点目はリソースで以下のような設定をいれるところです。
limits: nvidia.com/gpu: '1'
実行
それでは準備が整ったので実行していきましょう。コードはすべて途中でも貼っている以下リポジトリにあげてあります。
クローンして実行します。
git clone https://gitlab.marufeuille.dev/masahiro.ishii/awesome-tf-mlops/ cd k8s kubectl apply -f trainer.yaml
はい。これで終わりで完了を待つだけです。
状況はコンソールで見たり、
kubectl get pods
とかで見れるはずです。
完了するとこんな感じになるはずです。
お金について
さて。冒頭でお金あまりかからないという話をしましたが、実際にどうだったのか見ていきましょう。
残念ながら、AlibabaCloudの公式ページ上ではどの課金が該当するのか特定することはできませんでした。
そのため、結果(請求額)から遡ることにします。
なおこれは、1回分の実行ではなく他の練習含めて数回分まとまってしまっています。
そんなわけで請求額は$0.889000だったわけですが、今回指定したgn5-c4g1.xlargeは以下価格表を見ると、時間単位でこんな課金でした。
(最新版はこちらより)
定価は$1.821/hourなので、請求額の$0.889のほうが小さいと考えると、おそらく秒 or 分単位で課金されているように見えます。
(たぶんECIの課金単位である秒なのでしょうが、要確認です)
今回はapt updateやapt installもコンテナ起動時にやるようにしていたので、やや無駄な時間がかかっています。
このあたりを事前にビルドするなどしてコンテナレジストリに突っ込んでおけばそのあたりも短縮化されて、より効率よく利用できると思います。
最後に
今回はServerless k8s + GPUを利用して機械学習の学習を実施してみました。
GPUは高いので学習時のみ購入というのを考える方も多いと思いますが、API叩いていると少しめんどくさい・・・ということもあるかと思います。
その点、多少yamlに慣れる必要があるとはいえk8sの標準化された記述の中で実行できるというのは中々いいかもしれません。