知識0でもAWSを使ってmlflowサーバーを無料で立ち上げる方法

# なぜAWSでmlflowサーバーを立ち上げようと思ったか

はじめまして，機械学習を勉強し始めて1年になるものです。

この度はkaggleに初参加してみようと思ったのですが，kaggle notebookの実行ログをmlflowで管理したかったので，AWSを使って**無料の範囲内で**サーバーを立ち上げようと思いました。ただ，ネットにその情報が上がっていなかったので，他の方のために，知識0の人間が四苦八苦しながらmlflow serverを立ち上げた際の手順を記事にします。

※セキュリティ的にはガバガバなので，今回立ち上げるサーバーに重要な情報をアップロードしないでください。

# step1: アカウント作成とログイン

これは誰でもできるはずです。途中でクレジットカードの登録が必要です。
下のような画面が見えたら成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/5897ba6c-4379-bafe-0bb2-f5847f9a4e0b.png)

# step2: アクセスキーIDとシークレットアクセスキーを設定

1. IAMを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/7d1554ee-263d-a8d9-df3a-d252c20ef940.png)
1. ユーザーを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/9efa5e94-e497-a223-5ddc-5068eb80789c.png)
1. ユーザー名はお好きな名前を選択してください。これがあなたの名前になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/877e4c2f-b5d2-e329-2467-e43387a34d64.png)
1. 「グループの作成」をクリックしユーザーが所属するグループを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/7604242d-d965-9713-c147-8ae4ebecb08a.png)
1. 下記の2つをアタッチします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/13d14464-0e34-e3ab-31ba-8f7041c6cecb.png)
1. グループが作成されていることを確認して，「次のステップ」へすすみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/a2305d6f-64a9-af99-8ea0-ebf6e3dcff7b.png)
1. そのまま次へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/b0eac841-c088-8726-0067-bca712ac9e3a.png)
1. どんどん次へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/3854227b-5e7e-4e4c-355c-7054a331b54a.png)
1. csvを保存して閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/0be530a6-a110-54d6-8177-3d2777e5566d.png)


# step3: IMAロールの作成
1. ロールの作成を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/cb1e290a-28f4-e6c9-c392-bd26c00e282d.png)
1. EC2をユースケースとして選択して次へをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/d71e2bbd-d9b9-b4b0-e89c-b5bfc96d59a2.png)
1. 「SSMF」などと入力して「AmazonSSMFullAccess」を選択して次へをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/6f2bda14-61ca-f741-8064-789fd09deb78.png)
1. 管理しやすいようにタグを追加しない場合は，そのまま次へをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/529540a5-fe56-0b0e-77e0-c3c23defa1ef.png)
1. IAMロール名を適当に決めて次へをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/4897cf90-4edb-6638-afc2-68e4906446d1.png)
1. 作成されていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/c80ba823-1a7c-2a25-2fcf-c66174d7c6ac.png)

# step4: EC2インスタンスの起動
1. EC2のサービスへ行きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/92b6adae-be4d-bc93-9e17-f81d722ab564.png)
1. リージョンを東京にして（重要！！），インスタンスを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/655a85d6-53d2-5d44-a76d-8c30dc86291c.png)
1. 一番上の「Amazon Linux 2」が無料なのでこれを使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/3a71957d-c31a-f195-3914-a887926bb4bb.png)
1. 無料の`t2.micro`を選択して，**「次のステップ」**をクリックして次へ進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/99f9d788-5a8d-0222-2928-025e5f96d7a3.png)
1. 先ほど作成したIAMロールを選択して，「次のステップ」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/592c696b-4d7b-6f16-5f4a-907f2ab1f47a.png)
1. 30GBまで無料なので30に変更して「次のステップ」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/4b96a348-8ded-a120-4a2c-14adc1952d7d.png)
1. 特にタグが必要なければそのまま「次のステップ」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/49197795-de92-9b48-a213-95c35d224e91.png)
1. 画像の順番で真似していきます。あとでSSH接続しない場合は，SSHはなくてもいいです。  
5000番のポートを開けておくのを忘れないでやりましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/22e1e728-668a-18a0-f2fa-182a5d67acb5.png)
1. 「起動」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/e800bdb5-0bef-218e-e9fd-16f3ff9e47b9.png)
1. SSHでアクセスするためのキーペアを作成します。作成したらローカルPCに保存しておいて，絶対に消さないでください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/7411db7c-1a01-1331-b028-2f9d2a0a9b2c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/e5e37c20-024f-5fb6-0802-7fe62f7a64c6.png)
1. 起動が確認できたら，これでEC2インスタンスの作成は完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/46bb1c41-9b5e-417e-de91-99a78cc95493.png)

# step5: EC2インスタンスへ接続
1. 先ほど作成したインスタンスにチェックを付けてから起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/413a14b5-003a-53d4-a23a-735ad68f6af3.png)
1. 「接続」を押します。ここで書いてあるパブリックIPを控えておきましょう。ここでは`13.112.11.58`です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816697/99c7d72c-4315-3204-025c-67e268f8de24.png)

# step6: mlflow serverのインストールと起動
下記の手順で入力してください。

python3.7をインストールします。

```
sudo yum install python37
```

pipのためのpythonファイルをダウンロードします。

```
curl -O https://bootstrap.pypa.io/get-pip.py
```

pipをインストールします。

```
python3 get-pip.py --user
```

pathを追加します。

```
export PATH=~/.local/bin:$PATH
```

設定を反映します。

```
source ~/.bash_profile
```

mlflowをインストールします。

```
pip install mlflow
```

mlflowサーバーを立ち上げます。
立ち上げが終わったら。ブラウザのバツボタンを押して接続を切っても大丈夫です。

```
mlflow server --backend-store-uri  ./mlruns  --host 0.0.0.0
```

接続が切ったら先程控えておいたIPとポート番号をブラウザに入力します。
今回の例だと`13.112.11.58:5000`とブラウザに入力すればmlflowの画面にたどり着きます。

# 課金されないために知っておきたいこと

- Elastic IPを使うと，インスタンスを起動し直してもパブリックIPは変わらないのですが，Elastic IPはお金がかかってしまうため，今回は使用しませんでした。

- 無料EC2インスタンスは月に750時間稼働可能なのですが，EC2インスタンスを２つ以上起動しておくと750時間を超えてお金がかかります。ちなみにこの月750時間というのはAWSアカウントを作成してから1年間有効です。

- 最初はS3を使ってmlflowのartifactを保存しておきたかったのですが，5GBまでしか無料ではないので諦めました。

- 過剰請求されたときのためにAWS Budgetを使ってアラートを設定しておくといいと思います。詳しくはググれば出てきます。