このブログでは、こんな事がわかります!
- awsに深層学習(Deep Learning)に特化したGPUサーバー(インスタンス)の作り方がわかる
- awsのインスタンス上でjupyter notebookの起動方法がわかる
- kaggle apiを使ってから学習に必要なデータの取り出し方がわかる
今回の一枚は、以前、撮影させていただいたポートレートモデルの「ゆっこ様」
概要
kaggleのコンペの締め切りが、数日と近づいている状況で、分析用のサーバーを借りたいと思うことがあると思います。
しかし、サーバー選び、python、機械学習用のライブラリーのインストールなどやっていたら、それだけで1日を使ってしまいます。
今回は、awsを使ってサーバー選び、ライブラリーのインストール、jupyter notebookを使ってkaggleのカーネルと同様の環境を作る方法を紹介します。
前提条件
・awsのアカウントをすでに作成済みであること
・基本的なlinuxの操作ができること
awsでインスタンスを作る準備をする
GPUが使えるインスタンスの申請をする
まず、GPUが使えるインスタンスを用意するために、awsの人に許可を取ります。
GPUが使えるインスタンスは、awsのアカウントを作成しただけでは使用できません。
実際に、GPUを搭載した「g4dn.xlarge」インスタンスを起動しようとしたら、
以下のようなエラーが出力されて、インスタンスの作成に失敗します。
GPUが使用できる「G instances」の制限の緩和リクエストを送信します。
手順を以下の通り。
以降の手順は、値段が比較的安めの(1時間1ドル以内)GPUインスタンスである、
「g4dn.xlarge」インスタンスを立ち上げる例で話を進めます。
1.「制限」を選択します。
管理画面から「制限」を選択します。
2.「制限緩和のリクエスト」を実施
「All G instances のオンデマンドを実行中」を選択し「制限緩和のリクエスト」を押します。
3.申請を送信する
「サービスの緩和」を選びます。
画面にしたがって、申請理由は「機械学習で使用するため」などと記載し申請します。
!!ここ重要!!
緩和対象のGPUの個数を聞かれるのですが、ここで注意しないといけないことは、個数は、「サーバーの台数」ではなく「vCPU」の数で指定します。
インスタンス「g4dn.xlarge」の場合は、vcpuが4つあるため、4つで申請します。
以上で申請作業は終わりです。
早ければ、1時間以内に、許可が下りるかの連絡が日本語で来るので、それまで待ちます。
インスタンスを作成する
ここでは、深層学習(Deep Learning)に特化したインスタンス作成方法を解説します。
インスタンスを作成するポイント
申請が無事に通ったら、GPUインスタンスを起動します。
このブログでは、インスタンス「g4dn.xlarge」を起動する例で解説します。
AWSのイメージには、すでに機械学習用(深層学習)のライブラリーがインストールされているものがあります。それらを利用すれば、python,pandas,numpy,pytorch,tensorflowなどの機械学習関係のライブラリがインストールされているため、環境構築の時間がかなり短縮されます。
kaggleで利用するなら、osのみインストールされているインスタンスを起動してdockerからkaggleイメージを入れても良いのですが、dockerのところでハマったりすると余計に時間がかかってしまうため、ここではawsが用意してくれた深層学習イメージを利用しています。
さらに、GPUを使うためのcudaなどのドライバーもすでにインストールされているので、ドライバーインストールでハマる可能性が一気に少なくなります。
インスタンスを作製すると、sshなどで接続する際の鍵ファイルが渡されるので、大切に保存すること。
インスタンスを作成する手順
1. 「インスタンスの作成」ボタンを押します。
2. マシンイメージから「Deep Learning AMI (Ubuntu 18.04) Version 31.0」を選択します
3.「インスタンスタイプの選択」にて「g4dn.xlarge」を選びます。
4.必要があればいかを設定します。
・セキュリティグループ(分析のみならばsshだけで十分だと思います)
・ストレージの追加(何もしなれば100GBあるため十分足りると思う)
5.「確認と作成」ボタンを押してインスタンスを立ち上げます。
何がインストールされているか確認してみる
インスタンスの起動ができたら、sshで接続して、何がインストールされているか、コマンドを入力して確認してみましょう。
■pythonのバージョン
$python –version
Python 3.7.7
■インストールされているライブラリーの確認
$pip list
anaconda-client 1.7.2
anaconda-navigator 1.9.12
anaconda-project 0.8.3
Flask 1.1.1
jupyter 1.0.0
pandas 1.0.3
numpy 1.18.1
■condaによる仮想環境の確認
複数の環境があり、環境を切り替えることによりtensorflow、pytorchを使うことができます。
pytorchを使いたい場合は、以下のコマンドを入力して、pytorchがインストールされている環境に切り替えます。
$conda activate pytorch_p36
jupyter notebookを動かす
深層学習イメージであれば、jupyter notebookが最初からインストールされています。
ここでは、jupyter notebookを動かす手順を記載します。
jupyter notebookの起動まで
1. opensslで鍵を作成する
インスタンスにsshなどでログインした後、jupyter notebookにssl(https)で接続できるように、opensslを使って鍵ファイルを作成します。
以下、opensslを使った鍵作成例です。
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mykey.key -out mycert.pem
2. jupyter notebookを起動する
先ほど作製した鍵ファイルを利用して、jupyter notebookを起動します。
jupyter notebook –certfile=~/ssl/mycert.pem –keyfile ~/ssl/mykey.key
これで、httpsでjupyter notebookにログインできるところまで進むことができました。
デフォルトで8888ポートを利用します。
自分のPCでjupyter notebookを開けるようにする
次に自分のPCでjupyter notebookを開けるようにします。
手順は以下の通り
1.フォワードで接続
ssh -i ~/.ssh/kaggle-key.pem -N -f -L 8888:localhost:8888 ubuntu@3.112.254.254
ポイントは
・秘密鍵kaggle-key.pemを使ってインスタンスに接続
・ユーザ名はubuntu
・インスタンスのグローバルIDは「3.112.254.254」
・インスタンス側の8888ポートとローカル(自分のPC)側の8888ポートを紐付けます
2. ブラウザーの設定
MacPCなどで、以下のURLをブラウザーに入力します。
https://localhost:8888
ポイントは、「http」でなく「https」であることです。
ブラウザーによっては、セキュリティの関係で表示されないことがあります。
クロムの例で解説します。
3. localhostのみhttpsを許可する
クロムでURLを入力するところで以下の文字列を入力する。
「chrome://flags/#allow-insecure-localhost」
4. 一番上の「Allow invalid certificates for resources loaded from localhost.」をEnableに変更する。
これらの設定をすることで、自分のPCのブラウザーからインスタンス側で起動されている、jupyter notebookを使うことができます。
参考資料:
ChromeのSSL警告を、localhostの時だけ表示しないようにする
Kaggleのデータセットなどを簡単に持ち出すようにする
最後にkaggle apiの設定です。
apiを使えるようにすると、コマンド一つでkaggleのデータセットをダウンロードできたり、また、データのアップロードなどができて大変便利です。
apiのインストールは、以下のコマンドだけで実施可能です。
$pip install kaggle
データセットのダウンロードのコマンドは、各コンペの「dataset」のところで確認できます。
余談・なぜGCPを使わなかったのか?
なぜAWSなの?GCP(Google Cloud Platform)を使ったほうが安上がりでは?
そのように考えている人も多いと思います。
理由は、GCPの場合は、無料枠ではGPUは使えないのです。
無料枠で使おうとしたら、数秒後に「割り当てできない」という旨のメッセージが飛んできます。
以上、awsで深層学習環境を作る方法でした!