さくらのクラウド高火力プランでGoogle Colabを使う

はじめに

さくらのクラウドには、機械学習やディープラーニング(深層学習)に最適なGPUサーバを利用できる「高火力プラン」があります。

本記事では、Googleが提供している開発環境であるGoogle Colaboratory (Google Colab)のバックエンドにさくらのクラウド高火力プランのサーバを接続して使う方法をご紹介します。

さくらのクラウドへのログイン

今回の作業を行うには、さくらインターネットの会員IDと、さくらのクラウドのアカウントが必要です。これらの登録については、さくらのクラウドのマニュアルに手順が載っているので、そちらをご覧ください。

手順を要約すると以下のようになります。

  1. さくらインターネットの会員IDを取得 (すでにお持ちの場合は省略)
  2. さくらのクラウドのコントロールパネルにアクセス
  3. 画面左側の「さくらインターネット会員としてログイン」に、会員IDをとパスワードを入力してログイン
  4. さくらのクラウドのアカウントを作成 (すでにお持ちの場合は既存のアカウントを選択してもかまいません)

スタートアップスクリプトの登録

さくらのクラウドには、新たにサーバを作成する際にスクリプトを実行することで、使いたいソフトウェアのインストールや設定を行うことができる「スタートアップスクリプト」という機能があります。今回の作業ではこれを使って、Google Colabのバックエンドサーバの構築に必要なもののインストールや設定を行います。

サーバを作成する前に、使用するスクリプトを登録します。

コントロールパネルのサイドバーの「サービス」から「リソースマネージャ」を開きます。

サイドバーの「スクリプト」を開きます。

上部の「+ 追加」ボタンを押します。

スクリプト追加画面に次の内容を入力し、最下部にある「+ 作成」をクリックします。

項目設定内容
クラスShell
名前Google Colabランタイム
内容この表の下に掲載されているコードをコピーしペースト
タグ空欄
アイコン-

「内容」欄にペーストするコードはこちらです。

なお、CUDAドライバのバージョンが更新されると、下記スクリプトのままでは動かないことがあります。CUDA Toolkitのダウンロードページにてアーキテクチャなどを選択して表示されるインストーラを参考に、下記スクリプトの「NVIDIA CUDAドライバのインストール」の部分を編集して使ってください。

#!/bin/bash
 
# @sacloud-name "Google Colabランタイム"
# @sacloud-desc-begin
#   Google Colabからの「ローカル ランタイム接続」を受け付けるためのランタイムの設定と実行を行います。
#   起動後、サーバーにリモートデスクトップ接続をし、FirefoxでGoogle Colabを開いてください。
#   Google Colabで「http://127.0.0.1:8080/?token=<指定した接続トークン>」にローカル接続してください。
#   なお、初回のセットアップには相当の時間がかかります。(目安:30分から1時間)
#   また、100GB以上のディスクの接続が必要です。
#   セットアップ中に再起動が行われます。
# @sacloud-desc-end
# @sacloud-text integer min=1024 max=65535 default=8080 PORT_NUMBER "ポート番号(1024-65535)"
# @sacloud-password required shellarg maxlen=100 minlen=8 JUPYTER_TOKEN "接続トークン(英数字8文字以上)"
# @sacloud-text required shellarg maxlen=260 default=/home/ubuntu/content CONTENT_PATH "Google Colabで使用するデータのPath"
# @sacloud-checkbox required default= UNUSED_NVIDIA_EULA_CHECKED "NVIDIAのEULAに同意します https://docs.nvidia.com/cuda/eula/index.html"
# @sacloud-require-archive distro-ubuntu distro-ver-22.04.*
 
set -eu
 
PORT_NUMBER=@@@PORT_NUMBER@@@
CONTENT_PATH=@@@CONTENT_PATH@@@
echo JUPYTER_TOKEN=@@@JUPYTER_TOKEN@@@ > /root/.jupyter-env
 
SCRIPT_DIR=$(cd $(dirname $0); pwd)
SCRIPT_NAME=$(basename $0)
SCRIPT_PATH="${SCRIPT_DIR}/${SCRIPT_NAME}"
SCRIPT_DONE_PATH="${SCRIPT_PATH}.done"
NEEDS_REBOOT=0
 
export DEBIAN_FRONTEND=noninteractive
 
# OSのアップデート
if [ ! -f $SCRIPT_DONE_PATH ]; then
  echo "Updating packages using apt"
  apt update
  apt upgrade -y
  apt install -y ca-certificates curl gnupg lsb-release pciutils
fi
 
# コンテナ実行基盤のインストール
if [ ! -f /usr/share/keyrings/docker-archive-keyring.gpg ]; then
  echo "Installing a GPG key 'docker-archive-keyring'"
  curl -fsSL "https://download.docker.com/linux/ubuntu/gpg" | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
fi
 
if [ ! -f /etc/apt/sources.list.d/docker.list ]; then
  echo "Set up package source list for Docker-CE"
  echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg]" \
    "https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
  apt update
fi
 
if [ $(dpkg -l docker-ce | grep -c ^ii) -eq 0 ]; then
  echo "Installing docker-ce"
  apt install -y docker-ce docker-ce-cli
  systemctl enable --now docker.service
fi
 
# GPUの検出
if [ $(lspci | grep -c NVIDIA) -ge 1 ]; then
  echo "GPU(s) found"
  DOCKER_OPTION_GPU='--gpus all --runtime=nvidia'
 
  # NVIDIA CUDAドライバのインストール
  # See: https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=22.04&target_type=deb_local
  if [ $(dpkg -l cuda-toolkit-12-5 | grep -c ^ii) -eq 0 ]; then
    echo "Installing NVIDIA CUDA Driver"
    curl -fsSL -o /etc/apt/preferences.d/cuda-repository-pin-600 \
      https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-ubuntu2204.pin
    curl -fsSL -o /tmp/cuda-repo-ubuntu2204-12-5-local_12.5.0-555.42.02-1_amd64.deb \
      https://developer.download.nvidia.com/compute/cuda/12.5.0/local_installers/cuda-repo-ubuntu2204-12-5-local_12.5.0-555.42.02-1_amd64.deb
    dpkg -i /tmp/cuda-repo-ubuntu2204-12-5-local_12.5.0-555.42.02-1_amd64.deb
    rm -f /tmp/cuda-repo-ubuntu2204-12-5-local_12.5.0-555.42.02-1_amd64.deb
    cp /var/cuda-repo-ubuntu2204-12-5-local/cuda-*-keyring.gpg /usr/share/keyrings/
    apt update
    apt install -y cuda-toolkit-12-5
    NEEDS_REBOOT=1
  fi
 
  # NVIDIA Container Toolkitのインストール
  # See: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
  if [ $(dpkg -l nvidia-container-toolkit | grep -c ^ii) -eq 0 ]; then
    echo "Installing NVIDIA Container Toolkit"
    curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
      gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
    curl -fsSL https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
      sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \
      > /etc/apt/sources.list.d/nvidia-container-toolkit.list
    apt update
    apt install -y nvidia-container-toolkit cuda-drivers nvtop
    NEEDS_REBOOT=1
 
    # 同ツールとDockerの設定
    echo "Configuring Docker with NVIDIA Container Toolkit"
    nvidia-ctk runtime configure --runtime=docker
    systemctl restart docker
  fi
else
  echo "No GPUs found"
  DOCKER_OPTION_GPU=''
fi
 
# 有線インターネット接続をNetworkManager配下に設定
if [ -f /etc/netplan/01-netcfg.yaml ] && [ $(grep -c "renderer: networkd" /etc/netplan/01-netcfg.yaml) -eq 1 ]; then
  sed -i 's/renderer: networkd/renderer: NetworkManager/' /etc/netplan/01-netcfg.yaml
  NEEDS_REBOOT=1
fi
 
# デスクトップ環境とリモートデスクトップサーバーのセットアップ
if [ $(dpkg -l ubuntu-desktop-minimal | grep -c ^ii) -eq 0 ]; then
  echo "Installing desktop environment"
  apt install -y \
    ubuntu-desktop-minimal xrdp \
    fonts-noto-cjk-extra gnome-user-docs-ja language-pack-gnome-ja language-pack-ja \
    task-japanese-gnome-desktop
  systemctl enable --now xrdp-sesman.service xrdp.service
  
  # systemdターゲットをmulti-userに戻す
  systemctl set-default multi-user.target
 
  # 日本語環境の設定
  locale-gen
  localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE=ja_JP
  touch /etc/default/locale
  sed -i '/^LC_ALL/d' /etc/default/locale
  echo 'LC_ALL=ja_JP.UTF-8' >> /etc/default/locale
 
  NEEDS_REBOOT=1
fi
 
# 必要なら再起動
if [ $NEEDS_REBOOT -eq 1 ] || [ -f /var/run/reboot-required ]; then
  echo "Rebooting the system"
  reboot
fi
 
# Colabコンテナの実行
echo "Starting container"
mkdir -p /root/.cache $CONTENT_PATH
docker run \
  --env-file /root/.jupyter-env \
  $DOCKER_OPTION_GPU \
  -p 127.0.0.1:$PORT_NUMBER:8080 \
  -v $CONTENT_PATH:/content \
  -v /root/.cache:/root/.cache \
  -d asia-docker.pkg.dev/colab-images/public/runtime
 
echo "Done the script"
exit 0

操作確認ダイアログで「作成」をクリックするとスクリプトの登録が完了します。

サーバの作成

登録したスタートアップスクリプトを使ってサーバを作成します。

サーバ一覧画面での操作

コントロールパネルのサイドバーから「サーバ」をクリックします。

さくらのクラウド高火力プランは、現在は石狩第1ゾーンでのみ提供されています。そこで、ページ左上の部分が「石狩第1ゾーン」になっていることを確認します。「石狩第1ゾーン」になっていなければ、クリックして「石狩第1ゾーン」を選択します。

右上の「+ 追加」ボタンをクリックすると、サーバの作成画面が表示されます。

サーバ作成モードの選択

サーバ作成には「シンプルモード」と「通常モード」があります。今回は通常モードを使用しますので、画面右上の「シンプルモード」にチェックが入っている場合はチェックを外します。

サーバプランで「GPUプラン」を選択します。(「石狩第1ゾーン」以外を選択している場合、「GPUプラン」は表示されません。画面左上で「石狩第1ゾーン」が選択されていることを確認してください)

なお、GPUプランでは、仮想コア数4、メモリ56GBで固定です。「サーバプラン一覧から選択」は使用しません。

ここからはディスクやNICなど、各種項目を設定していきます。次の内容でサーバを設定します。

ディスク

項目設定内容補足
「新規ディスクを作成」を選択
ディスクプラン「SSDプラン」を選択「標準プラン」でも動作しますが、SSDに比べて動作は遅くなります
ディスクソース「アーカイブ」を選択「マイアーカイブ」ではありません
アーカイブ選択「Ubuntu Server 22.04.1 LTS 64bit #…」を選択「(cloudimg)」がないもの を選択します。「22.04」の後ろの数字は時期によって異なる可能性があります。「22.04.3」のようなものでも構いません。
ディスクサイズ「100GB」以上を選択インストール時点で約50GBを消費します。大量のモデルを利用する予定があるなど、容量を消費する見込みがある場合は余裕を持ったサイズのディスクを作成してください。
ディスクを暗号化するチェックの必要はありません
別のストレージに収容するチェックの必要はありません複数のサーバで冗長化するときに利用する設定のため、今回は必要ありません
準仮想化モードを使うチェックを入れますチェックを外すと動作が遅くなります

NIC

項目設定内容補足
インターネットに接続
インターネットに接続1IP 共有セグメント変更できません
準仮想化モードを使うチェックを入れますチェックを外すと動作が遅くなります
パケットフィルタ選択-

ディスクの修正

項目設定内容補足
ディスクの修正をするチェックを入れます
管理ユーザのパスワードパスワードを設定しますサーバ上でのパスワードを設定します。このサーバ専用のパスワードをおすすめします。何度も入力することになりますので、忘れないようにご注意ください。
ホスト名お好きな名前を設定します。例:「google-colab」半角のアルファベット・数字が利用できます
公開鍵「なし」を選択お手持ちのSSH公開鍵が存在する場合は設定してもかまいません
パーティションのUUIDの変更チェックの必要はありません
スタートアップスクリプト「shell」を選択
配置するスタートアップスクリプトスクリプト登録時に設定した名前(例では「Google Colabランタイム」)を選択
usacloudをインストールするチェックを入れます
インストールされているパッケージをアップデートするチェックの必要はありませんスタートアップスクリプト内で同等の処理が行われるためチェックは不要です
ポート番号通常は「8080」のままで問題ありませんGoogle Colabからローカルランタイムに接続するときのポート番号を設定します
接続トークンお好きなキーワードを設定します半角英数で設定してください。インストール後にGoogle Colabでローカル接続するときに指定します。公開ネットワーク上では使用されませんが、専用のトークンを生成するなどしてください。 (パスワードを再利用しないでください)
Google Colabで使用するデータのPath通常は初期設定のままで問題ありません
NVIDIAのEULAに同意しますEULAを確認後、チェックを入れますEULAはこちらのURLにあります

シンプル監視

項目設定内容補足
シンプル監視を有効にするチェックの必要はありません

サーバの情報

項目設定内容補足
名前ディスクの修正の「ホスト名」と同じ名前異なる名前をつけても特に問題は発生しませんが、同じ名前にしておくと便利です
説明空欄でかまいません
タグ空欄でかまいません
アイコン-

その他のオプション

項目設定内容補足
仮想サーバ上のキーボード…チェックの必要はありません
作成後すぐに起動チェックを入れます作成後すぐに作業を開始しない場合はチェックせずに作成だけ行うことも可能です

作成数

項目設定内容補足
作成数「1」に設定します

サーバの作成処理

設定が完了したら「+ 作成」ボタンをクリックします。すると、有料リソースの作成確認ダイアログが表示されます。内容を確認して「作成」ボタンをクリックします。

サーバの作成が行われます。ディスクのコピーが行われるため、しばらく時間がかかります。

サーバの起動

サーバの作成時に「作成後すぐに起動」をチェックしていた場合は、サーバは作成後に自動で起動します。よってこのステップで行うことはありません。

サーバをいったんシャットダウンした後、もう一度起動する場合は以下の手順で行います。

サイドバーの「サーバ」をクリックして、サーバ一覧を開きます。

作成したサーバの行をダブルクリックするか、右端の「▼」をクリックして「詳細」を選択します。

右上の「電源操作」から「▶ 起動」をクリックします。

起動確認のダイアログが出たら「実行」を押します。

サーバが起動すると、「電源操作」部が「UP」になります。

ソフトウェアのインストール

初めてサーバを起動したとき、スタートアップスクリプトによって各種ソフトウェアが自動的にインストールされます。このインストールには1時間程度かかります(ネットワークや他社サーバの状態によってかかる時間は変化します)。また、インストール中に自動的に再起動されます。

起動の完了は「コンソール」から確認できます。確認手順を以下に記載します。

サイドバーの「サーバ」をクリックして、サーバ一覧を開きます。

作成したサーバの行をダブルクリックするか、右端の「▼」をクリックして「詳細」を選択します。

「コンソール」タブをクリックします。

画面の黒い部分をクリックします。

画像のように「login:」というプロンプトが表示されていれば、インストールと起動が完了しています。

リモートデスクトップによる接続

サーバが起動したら、サーバにリモートデスクトップ接続を行います。ここではWindowsにおける操作例を示します。Macユーザの方はMicrosoft Remote Desktopなどを使って接続することができます。

まず、手元のPCでリモートデスクトップ接続アプリを起動します。(Windows+Q → 「リモートデスクトップ」で検索、など)

次に、「コンピューター」にサーバーのIPアドレスを入力します。必要であれば「オプションの表示」から接続設定を調整します。

サーバーのIPアドレスは、サーバ詳細のNICタブ、またはサーバ一覧のNIC列で確認できます。IPアドレスの横のコピーアイコンから、IPアドレスのコピーができるので便利です。

準備が完了したら「接続」ボタンをクリックします。初めて接続するときは、接続に関する警告が表示されます。内容を確認して、「はい」をクリックします。「今後確認しない」チェックボックスをオンにすると、次回以降このダイアログは表示されなくなります。

接続に成功すると、サーバへのログイン画面が表示されます。usernameに「ubuntu」を入力し、パスワードにはサーバ作成時に指定した「管理ユーザのパスワード」を入力し、「OK」ボタンをクリックします。

ログインに成功すると、Linuxのデスクトップ(GNOME)が開きます。

なお、ログイン後に下図のようなダイアログが表示されることがあります。このようなダイアログが表示されたら、内容を確認し、「管理ユーザのパスワード」を入力し、「認証」ボタンをクリックします。(以降、サーバを操作していると同様に表示される場合があります。その都度、内容を確認の上、パスワードを入力し、認証ボタンをクリックしてください)

下図のような画面が表示されたら、右下に並んでいるボタンの一番右端のボタン(アプリケーションボタン)をクリックします。デスクトップへ移行してしまった場合は、左上の「アクティビティ」をクリックしてください。

アプリ一覧の中から「端末」を探し、クリックして起動します。

開いた端末アプリケーションに次の内容を入力して、Enterキーで実行します(ペーストする場合は、右クリックメニューから「ペースト」を選択して貼り付けたあと、Enterキーで実行してください)。実行すると、デスクトップ画面の最下部にドックが追加されます。

gnome-extensions enable ubuntu-dock@ubuntu.com

ドックが表示されたら、端末アプリケーションは右上の「×」を押して終了してかまいません。

Google Colabの起動とローカル接続

続いて、このデスクトップ環境の中でブラウザを起動します。この環境にはFirefoxがインストールされているので、それを使います。まずはドックからFirefoxを起動します。

初めて起動したときは、Firefoxの初回起動設定が表示されます。画面の指示に従って初回設定を完了してください。通常は「この手順をスキップ→」ボタンを押していけば良いはずです。

初回設定が完了したら、Google Colabにアクセスします。Google Colabの画面が表示されたら、画面右上の「ログイン」ボタンからGoogleアカウントにログインします。

メニューから「ファイル」→「ノートブックを新規作成」をクリックし、新しい「ノートブック」を作成します。

右上の「接続」の右の「▼」をクリックしてメニューを表示します。

表示されたメニューから「ローカル ランタイムに接続」を選択します。

ローカル接続の設定ダイアログが開きます。

バックエンドURLに次のURLを入力します。「<ポート番号>」「<接続トークン>」は、サーバ作成時に設定した値を入れてください。また、httpsではなくhttpで始まっていることに注意してください。

http://localhost:<ポート番号>/?token=<接続トークン>

URLを入力したら、「接続」ボタンをクリックします。

接続が完了したら、「接続」ボタンが次のように変化します。

正しく接続できていることを確認するため、ここではGPUの情報を取得してみることにします。「コーディングを開始するか、AI で生成します」というメッセージが出ている箇所をクリックして、入力状態にします。

下記を入力して、Ctrlキーを押しながらEnterキーを押すとコマンドが実行されます。

!nvidia-smi

下図のようにGPUの情報が表示されれば成功です。

これで、Google Colabを使用してGPUを利用した計算をする準備が整いました。

(実行例) Stable Diffusionの実行

Google Colabの実行例として、代表的な画像生成AIモデルの1つであるStable Diffusionを実行してみます。

まず、新しい「ノートブック」を作成するか、既存のノートブックにコードセルを追加します。コードセルの追加は、「コード +」から行えます。

コードセルが出てきたら、次の内容を入力し、Ctrlを押しながらEnterを押します。

!pip install diffusers transformers

import torch
from diffusers import StableDiffusionPipeline

pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4")
pipe.to('cuda')

prompt = 'masterpiece, high quality, realistic, HD, calico cat'
negative_prompt = 'worst quality, low quality, zombie, sketch, interlocked fingers, comic, nsfw'

with torch.autocast('cuda'):
    image = pipe(prompt, negative_prompt=negative_prompt).images[0]

image

しばらく待つと、promptおよびnegative_promptをもとに画像が生成され、表示されます。今回は三毛猫の画像を作成しました。結果は実行するたびに異なります。

なお、デスクトップ環境から「端末」を開いてnvtopコマンドを実行しておくと、画像生成中にGPUが活用されていることがわかります。

サーバのシャットダウン(終了)

計算が終了したら、サーバをシャットダウンします。シャットダウンにはいくつか方法があります。(本記事で紹介する以外の方法もあります)

サーバのデスクトップからシャットダウン

デスクトップ右上をクリックし、メニューから「電源オフ / ログアウト」を選択します。

サブメニューから「電源オフ」を選択します。

電源オフのダイアログが表示されたら、「電源オフ」をクリックします。

認証ダイアログが表示されたら、管理ユーザのパスワードを入力して「認証」をクリックします。

リモートデスクトップ接続が切断され、サーバのシャットダウン処理が行われます。実際にシャットダウンが成功していることをクラウドコントロールパネルから確認してください。

クラウドコントロールパネルからシャットダウン

コントロールパネルの「電源操作」から「シャットダウン」を選びます。「強制停止」を行うとサーバが壊れる場合がありますので、こちらではなく「シャットダウン」を選んでください。

確認ダイアログが出たら、内容と対象のサーバが正しいことを今一度確認して「実行」を押します。

しばらくすると、状態が「DOWN」になりサーバが停止します。

サーバの削除

サーバが不要になったらサーバを削除します。

コントロールパネルのサイドバーから「サーバ」をクリックして、サーバ一覧を開きます。

削除するサーバの行をダブルクリックするか、右端の「▼」をクリックして「詳細」を選択します。

サーバの「電源操作」が「DOWN」になっていない場合、サーバのシャットダウンを行います。操作手順は「サーバのシャットダウン(終了)」を参照してください。

サーバの「電源操作」が「DOWN」になったら、右上から「サーバを削除」をクリックします。

サーバと一緒に削除するディスクを選択します。

右上の「削除」をクリックします。

確認ダイアログが出たら、内容を確認して「実行」を押します。

サーバ一覧からサーバが消えたら完了です。

おわりに

本記事では、GPUサーバを使って機械学習などを行ってみたいという方に向けて、Google Colabのバックエンドにさくらのクラウド高火力プランを接続する方法をご紹介しました。GPUサーバの利用例としてはStable Diffusionを動かしてみましたが、他の用途に使うこともできます。さくらのクラウド高火力プランは最低1時間から利用することができるので、短期的なお試しに最適です。ぜひ使ってみてください。

また、もっと本格的にGPUサーバを使いたい方には、NVIDIA H100 GPUを搭載した物理サーバ「高火力PHY(ファイ)」もあります。さくらのクラウド高火力プランでは計算能力が足りないという方はこちらもご検討ください。