8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Livebook から Hugging Face に 画像生成アプリ(GPU対応)をデプロイする

Last updated at Posted at 2023-05-23

はじめに

Livebook Launch Week 1 - Day 4 では、 Jose が音声チャットのアプリを Hugging Face にデプロイしていました

私は画像 AI 大好きなので、 Stable Diffusion による画像生成アプリを Hugging Face にデプロイしてみます

ただし、 Stable Diffusion は非常に重いモデルであるため、 CPU 環境で動かすと、1回の画像生成に10分以上かかってしまいます
以前、ローカルの CPU で実行した例はこちら

そこで、今回は Hugging Face にお金を払って GPU を使います

実装したノートブックはこちら

Hugging Face とは

トップページには "The AI community building the future." (未来を築く AI コミュニティー)と書かれています

スクリーンショット 2023-05-23 10.53.21.png

つまり、 AI エンジニアのためのコミュニティーサイト、というわけなのですが、その機能が非常に強力です

GitHub のようにコードや学習済モデルの管理・共有ができる上に、 Fly.io のようにアプリケーションのプラットフォームとして使うこともできます

まだアカウントを作っていない人は、トップページ右上の "Sign Up" から、まずは無料でアカウントを作りましょう

支払い設定

Hugging Face でコンテナを動かす場合(スペース)の料金表はこちら

CPU Basic であれば無料で使えますが、それ以外は有料です

今回は Nvidia T4 - small を使いたいので、まず Hugging Face の支払い設定をします

ログイン後のトップページ右上の自分のアイコンをクリックし、 "Settings" を開きます

スクリーンショット 2023-05-23 9.10.10.png

設定画面が開くので、左メニューから "Billing" を開きます

まだ支払い設定をしていない場合、支払い情報を更新するように求められます

スクリーンショット 2023-05-23 9.04.42.png

"Payment information" タブを開き、 "Add a payment method" ボタンをクリックしてください

スクリーンショット 2023-05-23 9.04.55.png

クレジットカードの情報を入力し終えると、支払い情報が以下のように表示されます

スクリーンショット 2023-05-23 9.10.39.png

スペースの作成

Livebook を動かすためのスペースを作ります

トップページ右上の自分のアイコンをクリックし、 "New Space" を開きます

スクリーンショット 2023-05-22 17.37.48.png

Space name に適当な名前(この例では "livebook")を入れ、 Space SDK に "Docker"、 Docker template に "Livebook" を選択します

スクリーンショット 2023-05-22 17.38.32.png

Space Hardware で "Nvidia T4・4vCPU・15GB・$0.60 per hour" を選択します
(遅くてもいいから無料がいい場合、 CPU の最小を選択してください)

スクリーンショット 2023-05-23 9.11.16.png

コンテナのビルドが開始され、数分待つと以下の画像のように一番下に Livebook の URL が表示されます

スクリーンショット 2023-05-23 9.14.29.png

URL の末尾 ?token= の後にあるトークンをコピーしておきます

ここで "CUDA Version 11.8.0" の文言が確認できます

ログパネルの右上 "x" をクリックし、ログを閉じます(後で開き直すこともできます)

スクリーンショット 2023-05-23 11.11.41.png

左側に Livebook の認証画面が表示されるので、コピーしておいたトークンを入力し、 "Authenticate" ボタンをクリックします

スクリーンショット 2023-05-22 17.42.18.png

すると、見慣れた Livebook のホーム画面が表示されます

スクリーンショット 2023-05-22 17.42.34.png

アプリケーションの実装

Livebook ホーム画面の右上 "+ New notebook" ボタンをクリックし、新しいノートブックを開きます

スクリーンショット 2023-05-22 17.43.11.png

"Notebook dependencies and setup" と書かれているセットアップセルに以下のコードを入力し、実行(セルの左上 "Setup" をクリック)します

Mix.install(
  [
    {:kino_bumblebee, "~> 0.3.0"},
    {:exla, "~> 0.5.1"}
  ],
  system_env: [
    {"XLA_TARGET", "cuda118"}
  ],
  config: [nx: [default_backend: EXLA.Backend]]
)

重要なのは {"XLA_TARGET", "cuda118"} の部分です

起動時のログに "CUDA Version 11.8.0" とあったので、 EXLA で使う CUDA のバージョン指定を cuda118 にしています

この指定がないと、せっかく GPU のあるハードウェアを選択しているのに、 GPU を使ってくれません

セットアップセルが実行できたら、 "Section" と次の黒いセルの間、左右中央あたりにカーソルを持っていきます

すると、 "+ Smart" というボタンが表示されます

スクリーンショット 2023-05-23 11.19.32.png

"+ Smart" をクリックするとメニューが開くので、 "Neural Network task" をクリックします

スクリーンショット 2023-05-22 17.43.45.png

すると、以下の画像のように Huggin Face のアイコンがついたセルが追加されます

スクリーンショット 2023-05-22 17.46.04.png

TASK に "Text-to-image" を選択すると、セルの内容が以下のように変化します

スクリーンショット 2023-05-22 17.46.39.png

この状態でセルを実行(セルの左上 "Evalutate" をクリック)します

Stable Diffusion のモデルダウンロードが始まり、しばらくすると Text の入力と Run ボタンが表示されます

スクリーンショット 2023-05-22 17.51.21.png

Text に "Elixir changes the world, high quality, detailed, digital art" を入力し、 Run ボタンをクリックしてみましょう

1分程待つと、以下のように画像が生成されます

スクリーンショット 2023-05-23 9.30.03.png

画像生成が上手く機能しました

では、これをアプリ用に少し修正します

スマートセルの右上、鉛筆のアイコンをクリックします

スクリーンショット 2023-05-23 11.26.46.png

確認メッセージが表示されますが、問題ないので "Convert" ボタンをクリックします

スクリーンショット 2023-05-23 9.34.21.png

すると、スマートセルがコード(二つのセル)に変換されます

一つ目のセルのセルの最下行に以下のコードを追加します

...
serving =
  Bumblebee.Diffusion.StableDiffusion.text_to_image(clip, unet, vae, tokenizer, scheduler,
    num_steps: 20,
    num_images_per_prompt: 2,
    safety_checker: safety_checker,
    safety_checker_featurizer: featurizer,
    compile: [batch_size: 1, sequence_length: 50],
    defn_options: [compiler: EXLA]
  )
+
+Kino.start_child({Nx.Serving, serving: serving, name: ImageGeneration})

Livebook Launch Week 1 - Day 4 の動画では batch_size を 8 に変更していましたが、 Stable Diffusion はメモリを大量に使うため、 batch_size はそのままにしておきます(大きくするとメモリ不足のエラーが発生します)

二つ目のセルを以下のように変更します

アクセスしてきた人毎に、自分のリクエストに対するレスポンスだけを受け取るためです

...
-Kino.listen(form, fn %{data: %{text: text}} ->
+Kino.async_listen(form, fn %{data: %{text: text}, origin: origin} ->
  Kino.Frame.render(frame, Kino.Text.new("Running..."))
- output = Nx.Serving.run(serving, text)
+ output = Nx.Serving.batched_run(ImageGeneration, text)

  for result <- output.results do
    Kino.Image.new(result.image)
  end
  |> Kino.Layout.grid(columns: 2)
- |> then(&Kino.Frame.render(frame, &1))
+ |> then(&Kino.Frame.render(frame, &1, to: origin))
end)
...

この状態で改めてセルを実行し、 Run ボタンをクリックしてみましょう

同じ画像が生成されれば OK です

もしメモリエラーなどが出た場合、セットアップセルから再実行してみてください

アプリのデプロイ

ノートブックの左メニューからロケットのアイコンをクリックし、アプリケーション設定を表示します

Slug に "image-generation" のような任意の文字を入れます(記号は "-" しか使えません)

スクリーンショット 2023-05-23 11.41.54.png

Deploy ボタンをクリックし、しばらくすると DEPLOYMENTS に表示されている Status が Running になります

もしここで Status が Error になった場合、メモリ不足になっている可能性があるので、セットアップせるだけ再実行してメモリを解放し、改めて Deploy ボタンをクリックしてみてください

スクリーンショット 2023-05-23 9.45.35.png

表示された URL の部分を新しいタブで開くと、 "https://rwakabay-livebook.hf.space/apps/image-generation" のような URL でアプリが開きます

スクリーンショット 2023-05-23 9.45.47.png

こちらでも同じように画像生成を実行可能です

スクリーンショット 2023-05-23 9.46.27.png

公開アプリへの追加

実装したノートブックを公開アプリとしてスペースに追加し、常に自動で起動するようにします

ノートブックの方に戻って、右上(ノートブックのタイトルの右側)にあるメニューを開きます

"Export" をクリックしてください

スクリーンショット 2023-05-23 9.47.23.png

表示されるエクスポートモーダルで、ダウンロード用のアイコン(黒いセルの右上)をクリックしてください

.livemd ファイルがダウンロードされます

スクリーンショット 2023-05-23 9.47.41.png

Hugging Face の画面で2段目右上 "Files" をクリックしてください

スペースに保管されているファイルの一覧が表示されます

スクリーンショット 2023-05-23 9.47.55.png

ファイルの一覧から "public-apps" のディレクトリーを開いてください

"public-apps" 内の ".gitkeep" と "welcome.livemd" のファイルが表示されます

スクリーンショット 2023-05-23 9.48.07.png

ファイル一覧の右上 "+ Add file" をクリックしてください

スクリーンショット 2023-05-23 9.48.25.png

アップロード画面が開くので、上部の "Drag files/folders..." と書いてあるエリアに、先ほどダウンロードしておいた .livemd ファイルをドラッグ&ドロップします

コミットメッセージは適当に入れておきます

左下 "Commit changes to main" をクリックしてください

スクリーンショット 2023-05-23 9.49.21.png

ノートブックの追加コミットを実行すると、自動的にコンテナのビルドが開始されます

スクリーンショット 2023-05-23 9.49.46.png

またしばらく待つと Livebook の URL が表示されるので、トークンを使って認証し、ホーム画面に移動します

ホーム画面の左メニューから "Apps" を開くと、先ほど追加したノートブックがアプリとして実行されています
(最初開いた時点では Status が Booting ですが、しばらく待てば Running になります)

スクリーンショット 2023-05-23 10.20.51.png

改めて画像生成アプリの URL を開けば、先ほどと同じ画面が開き、同じように画像生成することができます

スクリーンショット 2023-05-23 10.41.39.png

スペースの削除

一通り画像生成を堪能したらスペースを削除しましょう

そのままだとコストがどんどん追加されます

Hugging Face の上から2段目のメニュー右端 "Settings" からスペースの設定画面を開きます

スクリーンショット 2023-05-23 12.06.03.png

スペースの設定画面最下段にある "Dlete this space" でスペース名を入力し、 "I understand, delete this space" をクリックします

スクリーンショット 2023-05-23 12.06.17.png

これで削除完了です

実際にかかった費用

Billing のページで実際にかかった費用を確認できます

スクリーンショット 2023-05-23 12.16.29.png

私の場合、2時間52分使って $1.72 でした

2023/05/23 のレート(138.50)で 238.22 円ですね

AWS の SageMaker とコストを比較してみましょう
(SageMaker は us-west-2 オレゴンリージョン、オンデマンドの場合の料金です)

サービス インスタンス vCPU Memory 料金 ($/hour)
Hugging Face Nvidia T4 - small 4 15GB 0.6
AWS SageMaker ml.g4dn.xlarge 4 16GiB 0.736

メモリは GB (ギガバイト) 単位と GiB (ギビバイト) 単位なので単純比較しにくいですが、ほぼ同等です

SageMaker の GPU も Hugging Face と同様 T4 です

ほぼ同じ構成ですが、料金は Hugging Face の方が2割ほど安いですね

もちろん、 AWS の方は Saving Plans を使うなどすればもっと安く(最大 64% 削減)することが可能です

まとめ

はじめて Hugging Face で GPU インスタンスを動かしてみましたが、 特に問題なくアプリをデプロイすることができました

料金も比較的お手頃です

ノートブックをコミットすると、自動で再デプロイされる = CD (Continuous Delivery) が組み込まれているのが素晴らしいですね

今後もちょくちょく使ってみたいと思います

8
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?