🌤️

クラウドサーバーでのAI学習手順【AWS編2024年版】

2024/03/19に公開

クラウドサーバーでのAI学習手順

松尾研究所のからあげ(@karaage0703)です。松尾研究所では、多くの機械学習/AI関係のプロジェクトが走っています。特に計算リソースを多く使う、大規模データを使った機械学習、ディープラーニングの学習には、AWS/GCP/Azure等のクラウドサービス、スパコンであるABCIを使うことが多くあります。今回は、その中でもAWSで機械学習を実現する方法について必要な情報をまとめます。他のクラウドサービスに関しては、きっと研究所のメンバーが次々と書いてくれると思います。

実際にクラウドで学習を実行するまでの流れは、以下の4ステップです。

  1. 使用するクラウドサービス選定
  2. クラウドサーバー環境構築(インフラチームへの依頼)
  3. 公開鍵と秘密鍵の作成
  4. SSHでのサーバーへのアクセス

合わせて、環境構築後のTips(Dockerのセットアップ/VS Codeエディタを使ったリモートアクセス方法等)を記載します。

使用するクラウドサービス選定

まずは使用するクラウドサービスの選定からです。コスト、サービス、要件等によって決定します。本記事では既にAWSに決まった前提で記載していますので、この部分については割愛いたします。

一般的な話ですが、ここは悩んだら周りの経験ある人に相談するようにしましょう。

クラウドサーバー環境構築(インフラチームへの依頼)

いよいよクラウドサーバーの環境構築です。松尾研究所では、ここは社内のインフラチームに依頼するのが一般的な流れです。社内のポータルサイトから計算機環境・アカウントの申請をしましょう。必要な要件を伝えると要件に合わせたクラウドサーバー環境を構築していただけます。

公開鍵と秘密鍵の作成

インフラチームの環境構築が完了したら、公開鍵と秘密鍵を作成しましょう。なぜこれらが必要かは、以下のSSHの認証の基礎知識を読んでください。

また、ここの具体的な手順は使用するクラウドサービスによっても変わってきますので、詳細はそれぞれのクラウドサービスのマニュアルに従ってください。ただ、認証の基本的な考え方は同じですので、基礎知識はおさえておくとどのサービスでもスムーズに進められると思います。

SSHの認証方式の基礎知識

SSHの設定において重要となるSSHの認証方式に関して、簡単に記載します。SSHの認証方式は、代表的なものとして大きく「パスワード認証方式」「公開鍵認証方式の」2つの方式があります。

パスワード認証は、通常のパスワードを登録・認証する方式です。公開鍵認証はやや複雑で、秘密鍵と公開鍵という仕組みを使ってアクセスする方式です。詳細は割愛しますが、要は秘密鍵と公開鍵という2つの鍵のペアを勘合札のように使って認証を行う仕組みです。今回の場合は、公開鍵をターゲット側(Remote OS)において、秘密鍵を使ってアクセスする形になります。以下の記事が分かりやすいので、詳細を知りたい方は参照してください。

[秘密鍵/公開鍵]GCPにSSHで接続する方法

公開鍵と秘密鍵の作り方

公開鍵と秘密鍵を作る方法を紹介します。Mac/Linux前提です。Windowsの場合はWSL2を使用してください。

秘密鍵と公開鍵を作ります。以下のコマンドを実行してください。-Cオプションに記載するコメントの記載は任意です。プロジェクト名などを入れておくとよいでしょう(空白でもOKです)。

$ mkdir ~/.ssh
$ cd ~/.ssh
$ ssh-keygen -t rsa -C 'xxx_pjt'

以下のように鍵の名前の入力を促すメッセージが出てくるので、好きな名前で保存します(ここでは例としてxxx_pjtとします)

Enter file in which to save the key (/Users/<user name>/.ssh/id_rsa): xxx_pjt

続いて、パスワードを2回入力するように要求されるので、パスワードを設定してください。xxx_pjtxxx_pjt.pubという2つのファイルが生成されます。これが、それぞれ秘密鍵と公開鍵になります。

公開鍵(xxx_pjt.pub)に関してはクラウドサーバーに設定することになります。松尾研究所では、インフラチームで設定することになるため、プロジェクトメンバーの全員に、本記事の内容をもとに公開鍵を作ってもらい、まとめてインフラチームに連絡しましょう。

公開鍵 xxx_pjt.pub の中身をコピーします。ファイルの中身は好きなエディタで開いても、以下のとおりcatコマンドで表示してもOKです。

$ cat xxx_pjt.pub

Mac限定ですが、以下のようにpbcopyコマンドでクリップボードに直接コピーすると確実です。

$ pbcopy < xxx_pjt.pub

自分で公開鍵を設定する方は、AWSのドキュメントを参照ください。

SSHでのサーバーへのアクセス

サーバーのIPアドレス<ip>とユーザーアカウント<user name>を教えてもらい、以下コマンドでアクセスしましょう。

$ ssh <user name>@<ip> -i ~/.ssh/xxx_pjt

具体例として、ユーザー名testでサーバーのipが10.10.10.10の場合は以下になります。

$ ssh test@10.10.10.10 -i ~/.ssh/t_pjt

アクセスすると、初回は以下のような質問が出るのでyesとしてください。

Are you sure you want to continue connecting (yes/no/[fingerprint])?

続けて以下の通りパスワードを聞かれるので、パスワードを入力しましょう。

Enter passphrase for key '/Users/th/.ssh/xxx_pjt': 

以下のような表示が出たあと、コマンド入力状態になったら、サーバーにアクセス成功です。

Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 6.5.0-1014-aws x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

(略)

あとは、学習プログラムを分析サーバー上で実行すればAIの学習ができます。お疲れ様でした。

環境構築後のTips

ここからは、クラウドサーバーでの開発を効率化するためのTipsです。

SSHのコンフィグファイル設定によるアクセス簡略化

SSHでのアクセス~/.ssh/configというファイルに設定を書くことで簡単にログインできるようになります。以下はサーバー名が分析サーバーがanalysis-serverのときの設定例です。

Host analysis-server
     Hostname 10.10.10.10
     User test
     IdentityFile ~/.ssh/xxx_pjt

このあたりの設定例は、サーバー構成により異なる場合もあります。必要に応じてインフラチームに問い合わせましょう(基本的には、設定に関してはインフラチームからサンプルが提供されます)。

上記の設定ファイルを書くと、以下のように直接分析サーバーへsshでアクセスが可能です。

$ ssh analysis-server

sshするたびのパスワード入力を簡略化したい場合は、以下のコマンドを実施するとパスワード入力を省略できます( ~/.ssh/id_rsa の部分は自分で作成した秘密鍵のファイル名を指定してください)。

$ eval `ssh-agent`
$ ssh-add ~/.ssh/id_rsa

ファイルの転送

scpコマンドを使うか、VS Codeエディタでリモートアクセスしてドラッグ&ドロップでファイルが転送できます。大容量ファイルの場合は、重くなるのでVS Codeエディタでなくscpコマンドを使いましょう。

VS Codeエディタの場合は以下の設定もしておきましょう。

「VS Code」の拡張機能「Remote SSH」にてSSH接続中、接続先のCPUを占有する件の対策【rg】

サーバーへのDockerセットアップ

サーバーでDockerを使うと、GPUを使った学習環境の構築が楽にできます。サーバへのDockerのインストールに関しては、インフラチームに連絡しておきましょう(サーバー構築のときに連絡しておくのが良いです)。Dockerに関しては以下記事を参照ください。

https://zenn.dev/mkj/articles/33befbaf38c693

Dockerが動いているかは以下コマンドで確認しましょう。

$ docker ps

Dockerの再起動は、以下コマンドで可能です。

$ sudo service docker stop
$ sudo service docker start

また、以下のようなエラーが出る場合は、ユーザーがDockerグループに追加されていない場合が多いです。

以下のコマンドでユーザーを追加しましょう。

$ sudo gpasswd -a <user name> docker
$ newgrp docker

VS Codeエディタでのクラウドサーバーへのアクセス

VS CodeエディタのRemote Development拡張機能とDocker(devcontainer)を使って開発すると、VS Codeエディタ上でDockerを使った環境構築と開発ができて便利です。本記事では詳細は割愛しますが、以下記事などを参考に設定してみてください。

https://zenn.dev/karaage0703/books/80b6999d429abc8051bb/viewer/6ebae8

https://zenn.dev/karaage0703/books/80b6999d429abc8051bb/viewer/4e6567

また、Windows+WSL2環境で、VScodeのRemote-SSHでサーバに入れないケースがあるので、その場合は以下記事を参考に設定してみてください。

【VS Code】Remote SSHをWindows+WSL2で動かしてて困ったこと

サーバーの切断を防ぐ

VS Codeエディタを使って開発しているときに、途中で接続が切れてしまうトラブルを防ぐ方法です。クライアント側で~/.ssh/configに以下のようにServerAliveIntervalServerAliveCountMaxの設定をします。

Host analysis-server
     Hostname 10.20.20.20
     User test
     IdentityFile ~/.ssh/xxx_pjt
     ServerAliveInterval 60
     ServerAliveCountMax 60

加えて、サーバー側でもServerAliveIntervalServerAliveCountMaxの設定をしましょう。/etc/ssh/sshd_configに以下の行を追記しましょう(デフォルトだとこれらの項目がコメントアウトされているので、それを修正するのがよいでしょう)。権限がない場合は、管理者にお願いしましょう。

ClientAliveInterval 60
ClientAliveCountMax 60

参考記事:
【EC2】SSH接続が短時間で切れるときの回避方法
AWS EC2にSSHすると、かなり頻繁に接続が切れる。

サーバーにアクセスしている人がいるかどうか確認する方法

複数人でクラウドサーバーを共用しているときのTipsです。サーバーのインスタンスを切ったり変更する前に、以下のコマンドで作業している人がいないか確認できます。

$ ps aux | grep sshd

クラウドサーバで学習プログラムを走らせ続ける方法

サーバーで長時間学習している間、ずっと画面とにらめっこしているのは大変ですね。一旦サーバーから切断したいときもあると思います。サーバーで学習プログラムを走らせ続ける方法はいくつかあるのですが、私は仮想端末ソフト(byobu)を使うことが多いです。

以下コマンドを実行するとインストールできます(管理者権限がなければ、管理者にお願いしましょう)。

$ sudo apt-get update
$ sudo apt-get install byobu

以下コマンドで起動します。

$ byobu

byobuの基本的な操作は以下です。

ファンクションキー	機能
F2	新しいウィンドウを作る
F3	前のウィンドウに移動
F4	次のウィンドウに移動
F6	デタッチ
Ctrl+D	現在のウィンドウをkill
F9	コンフィグメニュー

byobu上で学習を走らせておけば、ターミナルを閉じてサーバーから切断しても、学習プログラムは走り続けています。再びサーバーにログインしてからbyobuを実行すれば、プロセスが動いていることを確認できるでしょう。

学習を走らせ続ける方法はbyobuを使う以外にもnohupを使う方法などもあります。その他の方法について知りたい方は以下記事を参照してください。

SSHの接続が切れてもプログラムを走らせ続ける方法

まとめ

クラウドサーバーでのAIモデル学習手順について書いてみました。一部松尾研究所独自の箇所もあるのと、会社によっては、この流れは大きく異なる可能性があることは注意ください。

この記事がクラウド環境でのAI学習において参考になりましたら幸いです。

他のクラウドサーバーでの学習やTips等も、今後新たな記事で補完していければと考えています。

変更履歴

  • 2024/03/19 セキュリティに関しての注意事項を強調
松尾研究所テックブログ

Discussion