クラウドサーバーでのAI学習手順【AWS編2024年版】
クラウドサーバーでのAI学習手順
松尾研究所のからあげ(@karaage0703)です。松尾研究所では、多くの機械学習/AI関係のプロジェクトが走っています。特に計算リソースを多く使う、大規模データを使った機械学習、ディープラーニングの学習には、AWS/GCP/Azure等のクラウドサービス、スパコンであるABCIを使うことが多くあります。今回は、その中でもAWSで機械学習を実現する方法について必要な情報をまとめます。他のクラウドサービスに関しては、きっと研究所のメンバーが次々と書いてくれると思います。
実際にクラウドで学習を実行するまでの流れは、以下の4ステップです。
- 使用するクラウドサービス選定
- クラウドサーバー環境構築(インフラチームへの依頼)
- 公開鍵と秘密鍵の作成
- SSHでのサーバーへのアクセス
合わせて、環境構築後のTips(Dockerのセットアップ/VS Codeエディタを使ったリモートアクセス方法等)を記載します。
使用するクラウドサービス選定
まずは使用するクラウドサービスの選定からです。コスト、サービス、要件等によって決定します。本記事では既にAWSに決まった前提で記載していますので、この部分については割愛いたします。
一般的な話ですが、ここは悩んだら周りの経験ある人に相談するようにしましょう。
クラウドサーバー環境構築(インフラチームへの依頼)
いよいよクラウドサーバーの環境構築です。松尾研究所では、ここは社内のインフラチームに依頼するのが一般的な流れです。社内のポータルサイトから計算機環境・アカウントの申請をしましょう。必要な要件を伝えると要件に合わせたクラウドサーバー環境を構築していただけます。
公開鍵と秘密鍵の作成
インフラチームの環境構築が完了したら、公開鍵と秘密鍵を作成しましょう。なぜこれらが必要かは、以下のSSHの認証の基礎知識を読んでください。
また、ここの具体的な手順は使用するクラウドサービスによっても変わってきますので、詳細はそれぞれのクラウドサービスのマニュアルに従ってください。ただ、認証の基本的な考え方は同じですので、基礎知識はおさえておくとどのサービスでもスムーズに進められると思います。
SSHの認証方式の基礎知識
SSHの設定において重要となるSSHの認証方式に関して、簡単に記載します。SSHの認証方式は、代表的なものとして大きく「パスワード認証方式」「公開鍵認証方式の」2つの方式があります。
パスワード認証は、通常のパスワードを登録・認証する方式です。公開鍵認証はやや複雑で、秘密鍵と公開鍵という仕組みを使ってアクセスする方式です。詳細は割愛しますが、要は秘密鍵と公開鍵という2つの鍵のペアを勘合札のように使って認証を行う仕組みです。今回の場合は、公開鍵をターゲット側(Remote OS)において、秘密鍵を使ってアクセスする形になります。以下の記事が分かりやすいので、詳細を知りたい方は参照してください。
公開鍵と秘密鍵の作り方
公開鍵と秘密鍵を作る方法を紹介します。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_pjt
とxxx_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に関しては以下記事を参照ください。
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を使った環境構築と開発ができて便利です。本記事では詳細は割愛しますが、以下記事などを参考に設定してみてください。
また、Windows+WSL2環境で、VScodeのRemote-SSHでサーバに入れないケースがあるので、その場合は以下記事を参考に設定してみてください。
【VS Code】Remote SSHをWindows+WSL2で動かしてて困ったこと
サーバーの切断を防ぐ
VS Codeエディタを使って開発しているときに、途中で接続が切れてしまうトラブルを防ぐ方法です。クライアント側で~/.ssh/config
に以下のようにServerAliveInterval
とServerAliveCountMax
の設定をします。
Host analysis-server
Hostname 10.20.20.20
User test
IdentityFile ~/.ssh/xxx_pjt
ServerAliveInterval 60
ServerAliveCountMax 60
加えて、サーバー側でもServerAliveInterval
とServerAliveCountMax
の設定をしましょう。/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
を使う方法などもあります。その他の方法について知りたい方は以下記事を参照してください。
まとめ
クラウドサーバーでのAIモデル学習手順について書いてみました。一部松尾研究所独自の箇所もあるのと、会社によっては、この流れは大きく異なる可能性があることは注意ください。
この記事がクラウド環境でのAI学習において参考になりましたら幸いです。
他のクラウドサーバーでの学習やTips等も、今後新たな記事で補完していければと考えています。
変更履歴
- 2024/03/19 セキュリティに関しての注意事項を強調
Discussion