PR

Vertex AI のインスタンスに jupyter ユーザーで SSH する方法

Vertex AI のインスタンスに jupyter ユーザーで SSH する方法 機械学習
記事内に広告が含まれています。
スポンサーリンク

どうも!初めましての方は初めまして、初心者のWebサイト勉強のとみーです!

Google のクラウドサービスの Google Cloud Platform (GCP) では、機械学習モデルの作成からデプロイまでを行うための Vertex AI Workbench があります。

Vertex AI Workbench では

  • PyTorch
  • TensorFlow
  • scikit-learn
  • pandas

などの主要なパッケージ・フレームワークが導入済みの JupyterLab 環境の中で色々な開発・分析・実験ができます。

とみー
とみー

環境整備が大変な GPU が手軽に利用できるのがいいですね!

そんな便利な Vertex AI なのですが、エディタとしての機能はあまり充実していないため、コードを書くときにストレスを感じることがしばしばあります。

Vertex AI の JupyterLab 環境で感じるストレス
  • シンタックスハイライトが弱い
  • 自動補完が効かない
  • コードジャンプができない
  • GitHub Copilot が使えない
とみー
とみー

一応 Vertex AI の JupyterLab にも拡張機能をインストールできるので、それで解決できるものもあります。

しかし、最近は GitHub Copilot という AI によるコーディングサポートツールが登場し、開発効率が一気に高められるようになったため、できれば GitHub Copilot が使える環境で作業したいというのが正直なところです。

そこで、今回は GitHub Copilot も(その他の VSCode の拡張機能も)問題なく使えるように

Visual Studio Code から SSH で Vertex AI インスタンスにアクセスする

方法をご紹介します!

インターネットで検索をすると SSH で Vertex AI のインスタンスにアクセスする方法を紹介した Web ページは見つかるのですが、紹介されたやり方を試してみたところ、SSH 接続後に書き込み権限がなく

とみー
とみー

Jupyter Notebook の実行はできるけどファイルの作成や保存ができない…

という問題に直面し、解決にかなり時間がかかってしまったので、今回はその解決方法についてもまとめています。

本格的に勉強するなら
スポンサーリンク

SSH で Vertex AI のインスタンスにアクセスする方法

単純に Vertex AI のインスタンスに SSH でアクセスし、作業するだけならこのセクションに書かれていることを実行するだけで OK です。

  1. Google Cloud CLI をインストール
  2. VSCode に Google Cloud Code をインストール
  3. VSCode に Remote Development をインストール

Google Cloud CLI をインストール

Google Cloud CLI は GCP に対してコマンドライン操作を行うためのツールです。

GCP へのアクセス認証を行うために、Google Cloud CLI をインストールする必要があります。

インストール方法は公式ガイドにわかりやすくまとめられているので、こちらに従いましょう。

とみー
とみー

機械翻訳された Google のドキュメントは非常に読みにくいことがありますが、このページは問題なく読めます。

gcloud init

まで実行できれば完了です。

次のコマンドを実行してバージョン情報が表示されれば正しくインストールできています。

gcloud version
GCP の基礎を勉強するなら

VSCode に Google Cloud Code をインストール

Google Cloud Code は VSCode を GCP と連携させ、VSCode で GCP に関する様々な操作を行えるようにする VSCode の拡張機能です。

わざわざ GCP の Web ページにアクセスしなくても、VSCode 上で

  • Google Compute Engine (GCE) の Notebook
  • Google Cloud Run のジョブ

などを管理することができます。

Vertex AI Workbench で作成した Notebook は、 GCE の VM インスタンスとして管理されます。

VSCode の拡張機能から Google Cloud Code をインストール

お使いの OS に応じて VSCode で次の操作を行いましょう。

Ctrl + Shift + Xキーを押して「拡張機能」ビューを開きます。

Cmd + Shift + Xキーを押して「拡張機能」ビューを開きます。

Google Cloud Code をインストール

拡張機能」ビューが開けたら cloud code と検索し、Google Cloud Code をインストールします。

Cloud Code から Google Cloud にログイン

インストールが完了すると、VSCode に Cloud Code タブが追加されます。

Cloud Code ビュー

Login to Google Cloud SDK」をクリックするとブラウザが開き、ログイン画面に移動するのでログインしましょう。

ログインが完了すると、Vertex AI Workbench で作成した Notebook などのインスタンスが表示されます。

Google Cloud SDK ログイン後

違うプロジェクトのインスタンスにアクセスしたい場合は、画面下の

Cloud Code ⇄ Project Name

のプロジェクト名をクリックすれば、プロジェクトを変更できます。

Notebook を起動し SSH でアクセス

SSH でアクセスしたい Notebook を起動しましょう。

Vertex AI Workbench から起動しても構いませんし、Google Cloud CLI で起動することもできます。

Vertex AI Workbench
Vertex AI Workbench から Notebook を起動

Vertex AI Workbench にアクセスし、対象の Notebook を選択した上で「開始」をクリックします。

次のコマンドを実行します。

gcloud notebooks instances start INSTANCE_NAME --location=LOCATION

INSTANCE_NAMEは Notebook の名前、LOCATIONは Notebook が置かれているゾーンです。

実際のコマンドは、例えば次のようになります。

gcloud notebooks instances start user-managed-notebook-my-project --location=asia-northeast1-a

起動中のインスタンス(Notebook)には、VSCode 側で緑色のチェックマークが付きます。

Notebook が起動している状態

起動中のインスタンスの をクリックすると、SSH でアクセスできます。

SSH アクセスに成功すると、VSCode のターミナルで次のようにプロンプトが返ってきます。

user_name@notebook_name:~$ 

このときのuser_nameは、登録している Google アカウントのメールアドレスを元に作成されます。

このとき、SSH 通信のための秘密鍵・公開鍵・ホストキーは、それぞれ以下に保存されます。

  • 秘密鍵~/.ssh/google_compute_engine
  • 公開鍵~/.ssh/google_compute_engine.pub
  • ホストキー~/.ssh/google_compute_known_hosts
とみー
とみー

コマンドライン操作だけで十分な場合は、これだけで終了です!

ただし、実際に機械学習・データサイエンス関連の作業を行う場合は、Notebook を使って作業する必要があります。

そこで、VSCode で SSH 接続したインスタンスの Notebook を操作できるように、リモート操作用の拡張機能をインストールしましょう。

VSCode に Remote Development をインストール

GCP に限らず SSH でアクセスした先の環境で開発を行う際によく使うのが、この Remote Development という拡張機能です。

Remote Development を使うと、ローカルでの開発と同じようにリモートサーバーのファイルを操作したり、プログラムを実行できるようになります。

VSCode の拡張機能から Remote Development をインストール

お使いの OS に応じて VSCode で次の操作を行いましょう。

Ctrl + Shift + Xキーを押して「拡張機能」ビューを開きます。

Cmd + Shift + Xキーを押して「拡張機能」ビューを開きます。

Remote Development をインストール

拡張機能」ビューが開けたら remote development と検索し、Remote Development をインストールします。

ホスト情報を設定

Remote Development で Vertex AI のインスタンスに SSH 接続するために、~/.ssh/configを編集しましょう。

VSCode やお好きなエディタ、ターミナル等で~/.ssh/configを開き、以下の内容を追記します。

~/.ssh/config
Host 好きな名前
    HostName Notebook の IP アドレス
    IdentityFile ~/.ssh/google_compute_engine
    User 先ほど上で表示された user_name
  • Host
    • SSH でアクセスする際に表示される名前
    • インスタンス名や Notebook 名などに設定するとわかりやすいです
  • HostName
    • Notebook の IP アドレスは Google Compute EngineVM インスタンスページで確認できます
    • Vertex AI の Notebook の IP アドレス
  • IdentityFile
    • Cloud Code で SSH アクセスしたときに作成される秘密鍵のパス
  • User
    • Cloud Code で SSH アクセスしたときのユーザー名
    • user_name@notebook_name:~$ の場合、ユーザー名はuser_nameです

例えば次のようになります。

~/.ssh/config
Host user-managed-notebook-my-project
    HostName 30.100.100.100
    IdentityFile ~/.ssh/google_compute_engine
    User user_name
SSH をきちんと理解するなら

Remote Development で SSH 接続

~/.ssh/configが準備できたら、Remote Development を使って Vertex AI インスタンス(Notebook)に SSH 接続しましょう。

Ctrl + Shift + Pキーを押してコマンドパレットを開きます。

Cmd + Shift + Pキーを押してコマンドパレットを開きます。

Remote-SSH: Connect to Hostを検索し、クリックします。

Remote SSH: Connect to Host...
別の方法

VSCode の画面左下の Open a Remote Window をクリックして、Connect to Hostを選ぶことで同じページに移動できます。

Open a Remote Window - Connect to Host

その後、先ほど~/.ssh/configで設定したHostが表示されるので、クリックすれば接続できます。

Host を選択

接続後はローカルでの開発と同じようにフォルダーを開いたりファイルを作成したりできます。

とみー
とみー

左下の「SSH: 〇〇」から正しく接続できていることが確認できます。

拡張機能をインストールしたりもできるので、基本的な開発を行う上ではこれで全く問題ありません。

GitHub Copilot も使えます!

スポンサーリンク

Remote Development で SSH するときの問題

ただし、1つだけ Remote Development で SSH するときに生じる問題があります。

Remote Development で SSH したときのユーザー

上で見たように、Remote Development で SSH 接続すると

  • ユーザー:Google アカウントのメールアドレスを元にしたユーザー名
    • 例えばuser_name

となります。

ブラウザで作業する場合のディレクトリ・ユーザー

一方で、Vertex AI Workbench から JupyterLab を開き、ブラウザで作業を行う場合

  • ホームディレクトリ/home/jupyter
  • ユーザーjupyter

となります。

したがって、Remote Development で SSH した場合に/home/jupyter以外の場所に作成したファイルは、ブラウザでアクセスしたときに見えず、実行もできないので不便です。

とみー
とみー

これを避けるためには、Remote Development で SSH 接続した後に/home/jupyterの下で作業しなければいけません

NoPermissions (FileSystemError): Error: EACCES: permission denied

しかし、Remote Development で SSH 接続して/home/jupyterに移動し、ファイルを作成・保存しようとすると次のようなエラーが発生します。

Unable to write file 'vscode-remote://ssh-remote+user-managed-notebook-my-project/home/jupyter/temp.py'
(NoPermissions (FileSystemError): Error: EACCES: permission denied, open 'home/jupyter/temp.py')

これはログインユーザー(例えばuser_name)に/home/jupyterに対する書き込み権限がないことを意味しています。

ブラウザで作成したファイル(/home/jupyter下に保存)は実行できますが、編集はできません。

スポンサーリンク

書き込めるようにjupyterユーザーでログインする

/home/jupyterに対して書き込めるようにするためには、

  • jupyterユーザーでログイン
  • /home/jupyterの所有グループにログインユーザーを追加
  • /home/jupyterの所有者・所有グループを変更

といった方法があります。

とみー
とみー

jupyterユーザーでログインすることで解決できたので、今回はこの方法をご紹介します。

秘密鍵・公開鍵を生成

jupyterユーザーでログインするための秘密鍵・公開鍵を作成します。

ssh-keygen -t rsa -f ~/.ssh/KEY_FILENAME -C jupyter -b 2048

KEY_FILENAME認証鍵ファイルの名前です。お好きな名前を付けましょう。

-Cは公開鍵にコメントを追加するためのオプションで、ここでは VM インスタンスにログインするユーザーを指定しています。

コマンド実行後、以下の場所に鍵が作成されます。

  • 秘密鍵~/.ssh/KEY_FILENAME
  • 公開鍵~/.ssh/KEY_FILENAME.pub

VM の/home/jupyter/.ssh/authorized_keysに公開鍵をコピー

続いて、作成された公開鍵を VM インスタンスの/home/jupyter/.ssh/authorized_keysにコピーします。

とみー
とみー

先ほど作成した~/.ssh/KEY_FILENAME.pubの内容をコピーしておきましょう。

Google Compute EngineVM インスタンスのページから対象のインスタンスをクリックし、詳細タブから SSH 接続します。

Cloud Code や Remote Development を使って SSH 接続しても/home/jupyterへの書き込み権限がないので保存ができません。

新しいウィンドウでターミナルが開くので、そこで/home/jupyter/.ssh/authorized_keysを開き、コピーしておいた公開鍵(~/.ssh/KEY_FILENAME.pub)の内容を追記します。

とみー
とみー

VM での操作はここまでなので、SSH を終了して大丈夫です。

~/.ssh/configを更新

ローカルに戻ったら、上で行ったように~/.ssh/configjupyterユーザーで SSH するための情報を追記します。

~/.ssh/config
Host 好きな名前
    HostName Notebook の IP アドレス
    IdentityFile ~/.ssh/KEY_FILENAME
    User jupyter

jupyterユーザーで SSH 接続

以上の操作を終えれば、Remote Development でjupyterユーザーとして SSH 接続し、自由に操作できるようになります。

とみー
とみー

お疲れ様でした!

SSH をきちんと理解するなら

カスタム Image から作成したインスタンスの場合

自前の Docker Image から Vertex AI のインスタンスを作成した場合、上のやり方でもうまくいかないことがあります。

mkdir: cannot create directory '/home/jupyter/.vscode-server': Permission denied

問題の原因

調べてみると、

/home/jupyterの所有者・所有グループがjupyterではなくrootとなっていることが原因

だとわかりました。

上のやり方は/home/jupyterの所有者・所有グループがjupyterであることを想定したやり方だっため、うまくいきませんでした。

解決方法

この場合

/home/jupyterの所有者・所有グループをjupyterに変更すればいい

ので、Google Compute EngineVM インスタンスのページから SSH 接続し、次のコマンドを実行しましょう。

# root としてログイン
sudo su -

# /home/jupyter の所有者・所有グループを jupyter に変更
cd /home/jupyter
chown jupyter:jupyter .
スポンサーリンク

コメント

タイトルとURLをコピーしました