Amazon Web Services ブログ

Amazon SageMaker ノートブックインスタンスで一般的なワークフローを使用する方法



Amazon SageMaker ノートブックインスタンスは、データサイエンスや機械学習を行うためのスケーラブルなクラウドベースの開発環境を提供します。このブログ記事では、より生産性が高く、効果的な一般的ワークフローを紹介します。

このブログ記事で紹介するテクニックは、使い捨てと交換が可能であることを念頭におく、よりクラウドネイティブな方法でノートブックインスタンスを扱うツールとなります。以下を説明します。

  • まず、協調型の開発のために GitHub および AWS CodeCommit を使用する方法を示します。
  • 次に、AWS CloudFormation を使用して、ノートブックインスタンスを自動的にプロビジョニングし、jupyter ノートブックをアップロードする方法を示します。
  • 3 番目に、Amazon S3 バケットを使用してノートブックインスタンスからアセットをバックアップおよび復元する方法を示します。

チュートリアル

Git によるコラボレーション

ノートブックインスタンスは、1 人の開発者が 1 つのインスタンスに割り当てられている場合が最適な使用です。ただし、データサイエンティストはしばしば協調型の環境で作業をします。Git は、複数のコントリビュータがバージョン管理されたコードリポジトリに書き込むことを可能にするツールです。複数の開発者/データサイエンティストがそれぞれのノートブックインスタンスで作業し、リモートリポジトリからコードをプルし、変更をそのリポジトリにプッシュ (またはコミット) することができます。AWS CodeCommit と GitHub は、リモート Git リポジトリを配置することができる 2 つの場所です。

CodeCommit

CodeCommit リポジトリで作業するには、Amazon SageMaker コンソールを開き、次の手順に従います。

SageMaker インスタンスのロール設定

  1. AWS コンソールにログインします。
  2. 検索バーに「sagemaker」と入力し、sagemaker コンソールを開きます。
  3. 左側のメニューでノートブックを選択し、ノートブックを選択します (または最初に作成します)。
  4. [IAM role ARN] の下のリンクをクリックします。
  5. [Permissions] タブで、[attach policy] をクリックします。
  6. 検索バーに「CodeCommitPowerUser」と入力します。
  7. 「CodeCommitPowerUser」という名前のポリシーを選択します。
  8. 右下隅にある [Attach Policy] をクリックします。

CodeCommit リポジトリの作成

  1. AWS コンソールにログインします。
  2. 検索バーに「codecommit」と入力し、CodeCommit コンソールを開きます。
  3. [Create Repository] をクリックします。
  4. リポジトリに「SageMaker-git-tutorial」と名前を付け、(オプションで) 説明を付けます。
  5. [Create Repository] をクリックします。
  6. [skip] をクリックします。
  7. 接続タイプとして、「HTTPS」を選択します。
  8. ページの一番下にある「git clone」で始まるコマンドをコピーします。

CodeCommit リポジトリの複製

  1. AWS コンソールにログインします。
  2. 検索バーに「sagemaker」と入力し、sagemaker コンソールを開きます。
  3. 左側のメニューでノートブックを選択し、ノートブックを選択します (または最初に作成します)。
  4. [IAM role ARN] の下のリンクをクリックします。
  5. [Permissions] タブで、[attach policy] をクリックします。
  6. 検索バーに「CodeCommitPowerUser」と入力します。
  7. 「CodeCommitPowerUser」という名前のポリシーを選択します。
  8. 右下隅にある [Attach Policy] をクリックします。

 

ここでは、ステップ #3 以降のコマンドを便宜的に示します。

bash 
git config --global credential.helper '!aws codecommit credential-helper $@'
git config --global credential.UseHttpPath true
ls 
cd SageMaker
git clone https://git-codecommit.us-east-1.amazonaws.com/v1/repos/SageMaker-git-tutorial
cd SageMaker-git-tutorial
touch README.md
git status
git add README.md
git commit -m "add README.md"
git push origin master

GitHub

Amazon SageMaker ノートブックインスタンスで Github を使用するには、次の手順に従います。

  1. GitHub リポジトリを作成する
  2. CodeCommit のチュートリアルの最後にあるように、ノートブックインスタンスでターミナルを開きます。
  3. 以下の指示に従って、ssh キーを設定します。ステップ 3 に従って、次のコマンドを実行します。
    ssh-add -K ~/.ssh/id_rsa

    代わりに、これを実行します (小文字の k):

    ssh-add -k ~/.ssh/id_rsa
  1. 以下の指示に従って、SSH キーを GitHub に追加します。ステップ 1 では、実行する代わりに SSH キーをコピーします。
    pbcopy < ~/.ssh/id_rsa.pub

    実行:

    cat ~.ssh.id_rsa.pub

    次に、ssh 公開鍵である出力を選択してコピーします。

  1. リポジトリへ移動し、 [clone or download] をクリックし、 [Use ssh] をクリックしてリポジトリの SSH url を取得します。
  2. ノートブックインスタンスのターミナルに戻り、次のコマンドを貼り付けて実行します。
    git clone {コピーした url}

これで、ノートブックインスタンスにリモート Git リポジトリのローカルコピーができます。多くの開発者が、自分のインスタンスで自分のコピーを作成し、リモートリポジトリにコードを提供することができます。Git での作業および協調に関する詳細は、この説明を参照してください。

それぞれのプロジェクトには独自の Git リポジトリが必要です。単一のインスタンスで複数のプロジェクトに取り組むことができます。また、設定情報を Git リポジトリに保存し、ノートブックインスタンス設定の一部としてそのリポジトリを複製することもできます。こうした「ドットファイル」の詳細についてはここを、個人用のドットファイルのリポジトリについてはここを参照してください。

初期化

ノートブックインスタンスを起動する際に、いくつかの設定手順を実行したい場合があります。AWS CloudFormation を使用すると、Amazon SageMaker ノートブックインスタンスのプロビジョニングとノートブックのインスタンスへのアップロードを自動化することができます。こうしたノートブックには、Git の設定や Python モジュールのインストールなど、ユーザーが必要とするすべての設定コードを入れることができます。

Amazon SageMaker ライフサイクル設定を使用して、ノートブックインスタンスが作成された時にこうした初期化アセットをダウンロードすることができます。

以下は、Amazon S3 バケットからファイルをダウンロードするスクリプトの例です。

#!/bin/bash

set -ex

BUCKET="your-s3-bucket"
DIRECTORY="s3-assets"

mkdir -p $DIRECTORY
aws s3 cp s3://$BUCKET /home/ec2-user/$DIRECTORY --recursive
chown "ec2-user":"ec2-user" $DIRECTORY --recursive

注意: これらのスクリプトが動作するには、インスタンスに S3 バケットにアクセスするための適切なアクセス許可が必要です。

バックアップの復元

インスタンスにダウンロードする必要があるデータセットまたは静的アセットがあるかもしれません。そのデータを Amazon S3 に保存し、以下のコマンドを使用してインスタンスにダウンロードすることができます。

aws s3 sync s3://{バケット} {ダウロードする先のディレクトリ}

このコマンドは、変更を Amazon S3 へアップロードします。

aws s3 sync {ダウロードする先のディレクトリ} s3://{バケット} 

インスタンスに S3 バケットへのアクセス許可があることを確認する必要があります。

SageMaker ライフサイクル設定を使用してノートブックインスタンスに cron ジョブを作成し、定期的なスケジュールで S3 バケットからインスタンスを自動的に更新することができます。

以下は、ライフサイクル設定で、インスタンスの起動時に S3 バケットからファイルをダウンロードするためのスクリプトです。

#!/bin/bash

set -ex

BUCKET="your-s3-bucket"
DIRECTORY="/home/ec2-user/s3-assets"

mkdir -p $DIRECTORY
chown "ec2-user":"ec2-user" $DIRECTORY --recursive
aws s3 cp s3://$BUCKET $DIRECTORY --recursive > /home/ec2-user/backup.log 2>&1

以下は、インスタンスに cron ジョブを追加して、時間単位のスケジュールで S3 バケットにディレクトリをバックアップする別のスクリプトです。

#!/bin/bash

set -ex

BUCKET="your-s3-bucket"
DIRECTORY="s3-assets"
CMD="aws s3 sync /home/ec2-user/$DIRECTORY s3://$BUCKET--recursive > /home/ec2-user/backup.log 2>&1"
cronjob="0 * * * * $CMD"

mkdir -p $DIRECTORY
chown "ec2-user":"ec2-user" $DIRECTORY --recursive
echo "$cronjob" | crontab -u "ec2-user" -

注意: これらのスクリプトが動作するには、インスタンスに S3 バケットにアクセスするための適切なアクセス許可が必要です。

ファイル共有

Amazon Elastic File System を使用すると、SageMaker ノートブックインスタンス間でファイルを共有することができます。このブログ記事、Mount an EFS file system to an Amazon SageMaker notebook (with lifecycle configurations) では、EFS を使用するようにインスタンスを設定する方法について説明しています。これは、ユーザーの “/home” ディレクトリを 1 か所に保存し、複数のインスタンスで使用する素晴らしい方法です。これを想像してみると、ノートブックインスタンスをオンにすると、ライフサイクル設定によってホームディレクトリが EFS からインスタンスのホームディレクトリにマウントされます。これで、すべての設定とドットファイルを使用できるようになります! 別のノートブックインスタンスまたは EC2 インスタンスを起動した場合は、EFS ディレクトリをマウントして、そこでファイルにアクセスすることもできます。

まとめ

こうしたテクニックがなければ、ノートブックインスタンスは壊れやすく、再現性がなくなり、作業が分離されて損失を被る危険性があります。ここで、ノートブックインスタンスを作成し、パッケージのインストール、S3 からのデータのダウンロード、プロジェクトのリポジトリの複製を行うブートストラップスクリプトをアップロードする CloudFormation テンプレートの起動を想像することができます。このテンプレートはチーム内の個人が使用し、アカウントや AWS リージョンの間で環境を複製し、作業を再現し、コラボレーションや実験を奨励し、クラウドで作業をするだけでなくそのフルパワーを活用します。


今回のブログ投稿者について

John Calhoun は、AWS パブリックセクターパートナーチームのアソシエイトソリューションアーキテクトです。彼は顧客やパートナーと協力してさまざまなプロジェクトでリーダーシップを発揮し、AWS を使用する際の時間を短縮することを手伝っています。