高火力 DOK 1分クッキング 〜「外部接続機能」でJupyter Notebookを超簡単に起動する手順〜
はじめに
こんにちは!小田島です。私は、さくらインターネットが提供するAI向けプラットフォームサービス「高火力 DOK」の開発マネージャーを務めています。
さて、2024年6月27日に高火力 DOK(以下「DOK」)がリリースされました。DOKを一言で説明すると、「GPUを使えるマネージドなコンテナーサービス」です。使い方はとてもシンプルで、実行したいDockerイメージ(と、必要に応じて上書きするCMD/ENTRYPOINT)を指定すると、そのイメージをタスクとして実行できます。NVIDIA社製の高性能なGPUが提供されているので、GPUの特性を最大限に活かせます。
先日、そのDOKに新しい機能「外部接続」が追加されました。これは、タスクが開いているポートに外部(インターネット)からHTTPS接続できるという機能です。これまでDOKは「終わりのあるタスクの実行」が前提でしたが、この機能追加により、ウェブサービスの実行も可能になりました。
詳しくはマニュアルにも記載されていますが、いくつか制限事項があります。
- 外部からの接続はHTTPS(443/TCP)のみです。暗号化通信はDOK内の設備で終端し、実行中のコンテナーにはHTTPで接続します。
- 独自ドメインの設定機能はありません。
- 異常終了したコンテナーを自動的に再起動させたり、負荷に応じてオートスケールする機能はありません。
- 長時間(20日以上)実行しているタスクは自動的に強制終了されます。
「デーモンのように永続的に動かすのではなく、バッチ処理のように終わりのあるタスクを実行する」というDOKの設計思想は変わっていません。そのため、本機能もあくまで永続的なデーモンではなく、補助的に使用することを想定しています。
本機能の使用例として、Jupyter Notebookを超簡単に起動して画像を生成する手順を説明します。Dockerについての知識は不要で、事前にお客さま側でイメージを作っておく必要もありません。本記事ではDockerやJupyter Notebookについての解説は特に行いませんので、この記事を読んでさらに知りたくなった方は公式サイトや解説サイトなどで学習してみてください。
なお、これ以降に出てくるスクリーンショットやDockerイメージのタグ名、ライブラリーのバージョン等は、本記事執筆時点(2024年11月時点)のものです。今後、表示内容が変わったりタグ名が使えなくなったりする可能性がありますのでご了承ください。
準備
あらかじめ、DOKにサインアップしておく必要があります。そのためには「さくらのクラウド」のアカウントが必要です。「さくらのクラウド」のアカウント取得方法については、マニュアルをご覧ください。
取得したアカウントでさくらのクラウドにログインすると、サービス一覧が出てきます。ここから「高火力 DOK」をクリックしてください。
ログイン中のアカウントで初めてDOKを使う場合は、最初に約款への同意画面が表示されますので、確認の上、同意する場合は先へ進んでください。DOKのコントロールパネルが表示されたら、サインアップは完了です。
なお、新規サインアップしたアカウントには3,000円分の無償枠が付与されます1。Dockerイメージの動作確認や、速度検証等にご活用ください。
Jupyter Notebookを動かしてみる
いよいよJupyter Notebookを動かしてみましょう。コントロールパネル左側のメニューから「タスク」を選んでください。
タスクの一覧画面が表示されたら、右上の「新規作成」をクリックしてください。
新規作成画面で、以下の内容を入力してください。その他の設定はデフォルトのままで構いません。
項目 | 内容 |
---|---|
イメージ | quay.io/jupyter/pytorch-notebook:cuda12-python-3.112 |
HTTP | (トグルスイッチをONにする) |
ポート | 88883 |
「作成」ボタンをクリックすると、いよいよJupyter Notebookが起動します。「開始日時」が表示されるまでしばらくお待ちください。タスクの状態が「実行中」になっても、「開始日時」が表示されるまではタスクが起動していません。
「開始日時」が表示されたら、いよいよJupyter Notebookにアクセスしてみましょう。まず、「タスクの状態」に表示されている「HTTP URI」の文字列(https://XXXXXXXX.container.sakurausercontent.com
)をコピーして、テキストエディター等にメモしてください。
その後、「ログを表示」をクリックしてタスクの出力ログを確認し、"Or copy and paste one of these URLs"の下にあるURLのパス部分(/lab?token=XXXXXXXX
)をコピーして、同じくテキストエディターにメモしてください。URLが2つありますが、どちらもパス部分は同じです。
最後に、テキストエディターにメモした2つの文字列を連結させたURL(https://XXXXXXXX.container.sakurausercontent.com/lab?token=XXXXXXXX
)をブラウザーの新しいタブで開いてください。これでJupyter Notebookへアクセスできました!
Jupyter Notebookで画像を生成してみる
いよいよJupyter Notebookで画像を生成してみましょう。画像生成というとなんだか難しそうに思えますが、今回は数行のコードを入力するだけでとても簡単に生成できる手順を紹介します。
まず、いくつかアイコンが並んでいる中の一番上、"Notebook"内の"Python 3 (ipykernel)"をクリックしてください。すると、下のように何やら入力しろと言わんばかりのテキストボックスが表示されます。
そこに以下のように入力し、上のツールバーにある▶︎ボタンをクリックしてください。
!pip install --upgrade diffusers accelerate transformers
何やらダウンロード中やインストール中のログがズラズラと表示されています。最後に"Successfully installed ..."と表示されるまでしばらく待ちましょう。
次に、その下のテキストボックスに以下の内容を入力してください。1行しか入力できないように見えますが、エンターキーを押せば入力欄が広がり、複数行入力できるようになります。入力が終わったら、先ほどと同じように▶︎ボタンをクリックしてください。
import torch
from diffusers import StableDiffusionPipeline
# プロンプト
prompt = 'kitten, sleeping'
# モデルからパイプラインを作成
pipe = StableDiffusionPipeline.from_pretrained('CompVis/stable-diffusion-v1-4', torch_dtype=torch.float16).to('cuda')
# 画像生成!
image = pipe(prompt).images[0]
image
少し待つと、コードの実行が始まります。最初に何やら警告のようなものが出るのでドキッとするかもしれませんが、実行に支障はないので安心してください。
さらにしばらく待つと、プロンプトに応じた画像(寝ている猫ちゃん)が表示されます。これでJupyter Notebookによる画像生成は完了です!
変数prompt
の値を変更すると、別の画像を生成できます。ぜひ色々試してみてください。
後片付け
これで画像生成は終わりですが、最後にJupyter Notebookのタスクを終了させましょう。これを忘れると、タスクが起動している間ずっと料金が発生し続けてしまいます。Jupyter Notebookを開いているタブを閉じるだけではタスクは終了しませんのでご注意ください。
終了方法は簡単です。タスクの詳細画面で、右上の「中断」ボタンを押すだけです。
以上で作業は終わりです。おつかれさまでした!
終わりに
いかがでしたか?自分でDockerイメージを作成しなくても、複雑なコードを入力しなくても、簡単に画像生成を体験できたと思います。「え、たったこれだけのコードで画像を生成できるの?」と思った方もいるかもしれません。
これもひとえに技術の進歩に尽きます。大量のデータを高速に処理できるGPU、それを保持できるメモリーやストレージ、そしてそれらのハードウェア資源を簡単に使えるOSSのライブラリー群の充実。いい時代になりましたね。昔は少ない資源をやりくりしながら、行列演算ライブラリーなどをベースに各自で機械学習ライブラリーやフレームワークを作っていたものです。
みなさんも、この記事をもとにぜひ色々な生成AIに挑戦してみてください。その際には、気軽にGPUを使える「高火力 DOK」をよろしくお願いします!
- 無償枠は、会員ID1つにつき、1つのアカウントにのみ付与されます。1つの会員IDで複数のクラウドアカウントを作成している場合は、最初にDOKにサインアップしたアカウントのみ無償枠が付与されます。 ↩︎
- タグ部分(
cuda12-python3.11
)は、本記事の執筆時点では使えますが、しばらくすると削除されて使えなくなるかもしれません。その場合、イメージ配布元からcuda*-python*
形式のタグを選んで指定してください。cuda
とついていないタグを指定すると、GPUを活用できませんのでご注意ください。 ↩︎ - Jupyter Notebookのイメージはポート番号8888をリッスンしているため、ここでは8888を指定します。他のイメージを実行する場合、そのイメージがリッスンしているポート番号を指定してください。 ↩︎