SageMaker 独自アルゴリズム作成方法

  今回はsagemaker-training-toolkitを使用して独自アルゴリズムをSageMaker上に作成する方法をまとめる．
---
予めインストールし，設定しておくパッケージ

- Cli
- [Docker](https://docs.docker.com/get-docker/)

**Dockerについて**

> unix ///var/run/docker.sock. is the docker daemon running?

上のエラーが出た場合はdocker.sockに関する権限を設定しておく．

```bash
$ sudo chmod 755 /var/run/docker.sock
```

---

## Docker imageの作成

独自アルゴリズムを使用する場合，DockerコンテナをECR上に作成する必要がある．今回はAWS提供の[sagemaker-training-toolkit](https://github.com/aws/sagemaker-training-toolkit)を使用する．

---

1 :train.pyを作成(詳しくはsagemaker-training-toolkitのREADMEを参照)
2 :train.pyで使用するmoduleをrequirements.txtに記入する．
3 :train.pyと同じディレクトリ内でDockerfileの作成.(Vscodeの場合は[code],Vimの場合は[vim])

```docker
$ code Dockerfile
```
4 :Dockerfileを編集(参考[https://blog.codecamp.jp/docker-file-how-to](https://blog.codecamp.jp/docker-file-how-to),https://github.com/aws/sagemaker-training-toolkit](https://github.com/aws/sagemaker-training-toolkit))

point: vimは入れといた方が良い.dockerimageにしたは良いけど変更部分が反映されてるか確認できる.ECRにプッシュしてエラー出たら時間がもったいない.


```dockerfile
# FROM:ベースとなるDockerimageの指定．詳しくはDockerHubのBase Imagesを参照．
FROM python
USER root

ENV PROGRAM_DIR=/opt/ml/code

RUN apt-get update
RUN apt-get install -y vim less

RUN pip install sagemaker-training
# /opt/ml/code ディレクトリの作成
RUN mkdir -p $PROGRAM_DIR
#作業ディレクトリの設定
WORKDIR $PROGRAM_DIR
#作業ディレクトリにrequirements.txtのコピー
COPY requirements.txt $PROGRAM_DIR/requirements.txt
#train.pyを移動
COPY train.py  $PROGRAM_DIR/train.py
#train.pyで必要パッケージをインストール
RUN pip install -r requirements.txt 
#永続的な環境変数を設定
ENV SAGEMAKER_PROGRAM train.py

```

5 :docker imageの作成(**最後のピリオド忘れずに)**

image nameは小文字のみ

```bash
$ sudo docker build -t <dockerimage Name> .
```

---

EX :docker コンテナを作成して起動してみる.

(参考[https://kure.hatenablog.jp/entry/2020/12/03/162027](https://kure.hatenablog.jp/entry/2020/12/03/162027),)

```bash
docker run --name <コンテナ名を決める> -it <Docker image名> bash
```

コンテナの削除

```bash
docker rm <コンテナ名>
```

## Docker imageをECRにpushする．


1 :ECR上にプライベートレポジトリを作成する．
![ECRrepo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708872/cf94d34f-588f-89de-16ac-ae55c4fb4d78.jpeg)

2 :レポジトリの[プッシュコマンドを表示]をクリックし，順次コマンドをターミナル上で実行する．


### **注意点**

tag付で<imagename>:latestにするのは避けたほうが良い.結構な割合でPUSHしたはいいが,いざプログラムを実行すると変更が反映されていなくてドツボにはまる.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708872/0c23cd65-3b06-203f-d6a6-1c491f75b8bf.png)
ファイルの内容を変更してimageをPUSHしたのにサイズが2263.25 MBから変わっていない．

---

## SageMakerで独自アルゴリズムを作成する．

ECRにPushしたDockerImageを使用し，SageMaker上に独自アルゴリズムを作成する．
![Untitled 5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708872/3e743bb0-346d-3bcb-5715-e6f21960545c.png)


# 終わりに
## 沼にハマったことまとめ

**Docker全般**

- windowsのwslを利用してUbuntuをインストールした後Dockerをインストールしたが動かない.

```bash
docker build -t XXX .
------------------------------------------------------------
=>unix ///var/run/docker.sock. is the docker daemon running?
```

/var/run/に移動したがdocker.sockがない.

⇒ Docker Desktopをダウンロードする.その後Setting⇒Generalに移動し,以下のようにチェックボックスを押す.
![Untitled 6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708872/6c68110a-87e2-ced7-5c66-bc3ca32d0aba.png)


**SageMakeでのトレーニング時**

- AlgorithmError: ExecuteUserScriptError: Command "/usr/local/bin/python [train.py](http://train.py/)

![Untitled 7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708872/60b21db3-e14c-888c-d057-3316833a7bf1.png)
⇒[ログを表示]からエラー内容を確認する.
**確認するべきチェックリスト**

- [ ]  必要なモジュールがrequirements.txt内で指定してあるか?(boto3,argparseは確実に必要.その他torchvisionなど.)
- [ ]  dockerimageをtag付するときにイメージタブをlatestのままにしていないか.
- [ ]  argである—train-dirのデフォルトは正しいか.(os.environ("SM_CHANNEL_TRAINING")⇒os.environ["SM_CHANNEL_TRAIN"])などのミス．

---

- ClientError: Artifact upload failed:Error 5: Received a failed archive status.
![Untitled 9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708872/dddc84fa-6576-acb4-ab1c-52436376380c.png)

ログ内容
![Untitled 10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708872/df235b93-7c21-82de-3394-9adc07f326a8.png)
⇒トレーニングのインスタンス設定時に追加ボリュームを増やす．通常Dockerコンテナのボリュームは10 GBだが，トレーニング後にモデルの保存を行う必要があるが容量が足りなくなる(100 epochで大体20 GBくらい必要)．

---

実行環境
> OS: Ubuntu LTS 20.04,Windows Subsystem for Linux:Ubuntu LTS 20.04
IDE :Visual Studio Code,Vim