Skip to the content.

VSCode Dev Containers を利用した AWS EC2 上での開発環境構築手順

本リポジトリでは,Windows・Linux PC 上の Visual Studio Code IDE (VSCode) から AWS EC2 へリモート接続し,VSCode Dev Containers を利用して深層学習や LLM ソフトウェア開発を効率良く行えるようにするための手順を示す. なお,本リポジトリはチーム開発時に,所属チームへクラウドネイティブで効率的な開発手法を導入することを目的としており,python コーディングにおける linter, formatter や VSCode extension,setting.json なども共通のものを利用するようにしている.

TL;DR

以下の Tips を整理し,手順書としてまとめた.また,最小限の手順で済むよう,bat ファイルや shell スクリプトを用意している.

目次

背景と課題

AWS 上で開発する際,社内プロキシ等が原因で VSCode から容易に Remote SSH できず,開発 IDE として VSCode を利用できない事例を多数見てきた.これにより,チーム開発時に,各メンバが異なる IDE(異なる Linter, Formatter)を利用する結果,チームとしての開発効率が低下してしまう.

一方,AWS Cloud9 のようなクラウドネイティブ IDE を利用してチーム開発を行うことで,開発 IDE を統一することは可能である.しかし,Cloud9 ベースの開発の場合,Linter の設定を自由に行えないため,コード内のバグ原因などの見落としが発生し,結果的に開発効率が悪くなる.加えて,Git コマンド,Docker コマンド,Linux 基盤の深い知見を求められるため,新規参画者には敷居が高く,即時参画には時間を要してしまう問題がある.(cloud9 ではデフォルトで pylint (formatter)を利用できるが,その設定などは煩雑で,手動で開発者が各々行う必要がある.)

解決したいこと

チーム開発で VSCode を利用し,Linter・Formatter を統一することで,チームとしてのコーディングスタイルの統一化,コードの可動性向上,無駄な Git Commit の削減を狙う.また,初学者には敷居の高い docker コマンドや Git コマンドを利用せずに,容易にコンテナ上での開発や,GUI ベースの Git 運用をできるようにし,効率良く DevOps を回せるようにする.これにより,開発者の開発効率の向上・新規参画者への引き継ぎ工数を最小化することができる.

解決方法

ローカル PC 上の VSCode から,VSCode Remote SSH で,SSM Session Manager Plugin 経由で EC2 インスタンスにログインできるようにする.また,VSCode Dev Containers を利用し,開発環境(コンテナ,Linter,Formatter,IDE の設定)を共通化する.

オリジナリティ

AWS Deep Learning Containers Imagesをベースに,VSCode Dev Containers を利用して,VSCode 上での開発を可能にしている.これにより,SageMaker Pipeline の開発や SageMaker Training Job の実行のみならず,深層学習,SageMaker Jumpstart 等で提供されていない FM の実行のための環境を迅速に構築することができる.

前提

Windows,Linux 上には VScode は install されているものとする.加え,AWS ユーザーは作成済みであり,Administrator 相当の権限を保持していることを想定している.なお,手順書中では,Windows でのセットアップに主眼を起き記述している.(Linux でも同様の手順で実施可能.)

手順

手順の各ステップの詳細

1. AWS CLI のインストールとセットアップ

公式ドキュメント1 2を参考に,AWS CLI をインストール,セットアップする.

AWS Access Key ID [None]: IAM ユーザーの作成時にダウンロードした csv ファイルに記載
AWS Secret Access Key [None]: IAM ユーザーの作成時にダウンロードした csv ファイルに記載
Default region name [None]: ap-northeast-1
Default output format [None]: json
ca_bundle = C:\path\to\zscalar_root_cacert.cer
※Zscaler CA 証明書のエクスポート方法
公式ドキュメント[^3]を参考に,エクスポートする. - コンピュータ証明書の管理 > 信頼されたルート証明機関 > 証明書 - Zscalar Root CA を左クリック > すべてのタスク > エクスポート - 証明書のエクスポートウィザードで,次へ > Base 64 encoded X.509 を選択して次へ - 参照 > ディレクトリ・ファイル名を入力(ここではファイル名を`zscalar_root_cacert.cer`とする)> 次へ > 完了 > OK


2. SSM Session Manager plugin のインストール

公式ドキュメント3を参考に,SSM Session Manager plugin をインストールする.

3. ローカルの VSCode に extension をインストール

./setup/vscode/vscode_local_setup_win.batを実行し,VSCode の extension を一括インストールする.Linux の場合は,./setup/vscode/vscode_local_setup_linux.shを実行する.本バッチファイル,または shell の実行により,以下の extension がインストールされる.

4. CloudFormation で EC2 を構築

./setup/cf-template/cf-ec2.yaml(cf テンプレート)を利用し,CloudFormation で EC2 を構築する.以下に実際に構築されるリソースと,cf テンプレートの簡易説明を行う.また,CloudFormation の詳細な実行方法は後述しているので,必要があれば適宜参照されたい.

構築するリソース

EC2 の環境について

Deep Learning 用の AMI を利用しているため,以下が全てインストールされている状態で EC2 が構築される.

cf テンプレートの簡易説明

※CloudFormation 実行手順
- [CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/)を開き,スタックの作成を押下 - テンプレートの指定 > テンプレートファイルのアップロード > ファイルの選択で上記で作成した yaml ファイルを指定し,次へを押下 - [`./setup/cf-template/cf-ec2.yaml`](https://github.com/Renya-Kujirada/aws-ec2-devkit-vscode/blob/main/setup/cf-template/cf-ec2.yaml)を upload する. - 任意のスタック名を入力後,以下のパラメータを設定する - EC2InstanceType: インスタンスタイプ.デフォルトは g4dn.xlarge - VolumeSize: ボリュームサイズ.デフォルトは 100GB - ImageId: AMI の ID.デフォルトは Deep Learning AMI GPU PyTorch 2.0.1 の ID - VPCId: 利用する VPC の ID(デフォルト VPC の ID 等で問題ない) - SubnetID: 利用するパブリックサブネットの ID(デフォルト VPC のパブリックサブネット ID 等で問題ない) - 適切な IAM Role をアタッチし,次へを押下(一時的に Admin role で実施しても良いかもしれない) - 作成されるまで 30 秒~1 分ほど待つ


5. SSH の設定

./setup/get_aws_keypair/get_key_win.batを実行し,秘密鍵のダウンロードと.ssh/configの設定を自動実行する.Linux の場合は./setup/get_aws_keypair/get_key_linux.shを実行すること.なお,実行前に,ソースコードの変数KEY_IDINSTANCE_IDには CloudFormation の実行結果の各値を記述すること.

6. VSCode から EC2 インスタンスにログイン

VSCode のリモート接続機能を利用して,SSM Session Manager Plugin 経由で EC2 インスタンスに SSH でログインする.

==============check cuda==============
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Mon_Apr__3_17:16:06_PDT_2023
Cuda compilation tools, release 12.1, V12.1.105
Build cuda_12.1.r12.1/compiler.32688072_0
==============check gpu==============
Sat Dec 30 08:28:59 2023
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.104.12             Driver Version: 535.104.12   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  Tesla T4                       On  | 00000000:00:1E.0 Off |                    0 |
| N/A   31C    P8               9W /  70W |      0MiB / 15360MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|  No running processes found                                                           |
+---------------------------------------------------------------------------------------+
==============check torch==============
if you exec at first time, you might wait for a while...
torch.__version__: 2.1.0
torch.cuda.is_available(): True

7. EC2 インスタンスに VSCode extension をインストール

./setup/vscode/vscode_vm_setup.shを実行し,EC2 インスタンス上で Git の初期設定と VSCode extension のインストールを行う.なお,コード中のNAMEMAILには,各自の名前とメールアドレスを記述すること.

8. Dev Containers と AWS Deep Learning Containers Images を利用したコンテナの構築

VSCode DevContainers と AWS Deep Learning Containers Imagesを利用し,コンテナを構築する../.devcontainer/devcontainer.jsonの initializeCommand で ECR へのログインを行うことで,AWS Deep Learning Containers Images(AWS 公式が提供する ECR 上のイメージ)を pull している.AWS Deep Learning Containers Imagesでは,PyTorch, Tensorflow, MXNet などのフレームワークがプリインストールされたイメージ(SageMaker Training Job での実行環境イメージ)に加え,HuggingFace,StabilityAI のモデルの推論のためのイメージが提供されており,利用するイメージを適宜変更・カスタマイズすることで検証時の環境構築を効率化することができる.

==============check cuda==============
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Mon_Apr__3_17:16:06_PDT_2023
Cuda compilation tools, release 12.1, V12.1.105
Build cuda_12.1.r12.1/compiler.32688072_0
==============check gpu==============
Sat Dec 30 08:12:03 2023
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.104.12             Driver Version: 535.104.12   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  Tesla T4                       On  | 00000000:00:1E.0 Off |                    0 |
| N/A   31C    P8               9W /  70W |      0MiB / 15360MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|  No running processes found                                                           |
+---------------------------------------------------------------------------------------+
==============check torch==============
if you exec at first time, you might wait for a while...
torch.__version__: 2.1.0
torch.cuda.is_available(): True

その他

インスタンスの起動・停止

開発開始時・終了時には,VSCode extension EC2 Farm経由で各々の EC2 インスタンスを起動・停止することが可能である.(AWS コンソールを開く必要はない.)

コーディングガイドラインと開発環境の設定

チーム開発において VSCode を利用するメリットは,Linter や Formatter をチームで共通化できる上,IDE の設定や利用する extension なども共通化することができる点である.これにより,チームメンバ間での利用するツールやコーディング上の認識齟齬は低減され,利便性の高い extension によって開発効率が向上すると考えられる.詳細は,./docs/coding-guidelines.mdを参照されたい.

チームでの EC2 の運用・管理

インスタンスの切り忘れ防止のために,AWS Lambda を利用して,夜 12 時に全ての EC2 インスタンスを停止させている.なお,運用サーバーなど特定のインスタンスは除外可能にできるようにしている.詳細は,./docs/operation_ec2.mdを参照されたい.

その他 Tips

参考

  1. AWS CLI の最新バージョンを使用してインストールまたは更新を行う 

  2. AWS CLI をセットアップする 

  3. Windows での Session Manager プラグインのインストール 

  4. Add a non-root user to a container