Numerai-cliを使って予測ファイルの提出を自動化する方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015710/4b8b49f9-0f60-244a-7ebf-654491fd2403.png)

##はじめに
 今回の記事では、Numeraiに自動で予測ファイルを提出する[Numerai CLI](https://github.com/numerai/numerai-cli "Numerai CLI")を紹介します。Numerai CLIとは、Numeraiの予測ファイルを自動で提出できるように支援するパッケージです。

今回、Numerai-cliの大幅なアップデートがあり、αテスターとして参加しました。そこで得られた知見を共有します。

特に、古いwindows(win8など）を使用している方は、本記事の手順通りにインストール・アクチべートすることをお勧めします。windows10,Linuxユーザーの方はすんなりとインストールできるらしいので、win8にかかわる部分は読み飛ばしてください。



Numeraiとは何？という方は私の過去の記事([日本語版](https://qiita.com/tit_BTCQASH/items/366a2d1c273507dd4b8c "日本語版") /[英語版](https://tit-btcqash.medium.com/a-comprehensive-guide-to-competing-at-numerai-70b356edbe07 "英語版"))をご参照ください。

また、公式が出しているNumerai-cliについての[記事](https://medium.com/numerai/building-the-numerai-network-af733c29d56f "記事")と、[Youtube](https://www.youtube.com/watch?v=7NWAlQEay_w&t=2060s&ab_channel=Numerai "Youtube")はこちらです。
(34:11に少しだけ私が言及されました。ありがとうございます！）

##目次
1. AWS(amazon web service)の設定
2. Numerai APIキーの取得
3. Python・Dockerの設定
4. numerai-cliの使い方
5.numerai computeを使用するまでの手順

##筆者の環境
windows8.1 Pro, Intel Core i5 9600K メモリ 32GB

##①AWS(amazon web service)の設定
　Numerai公式が用意した英語版の設定資料は[こちら](https://docs.numer.ai/help/compute-tutorial "こちら")。
　AWSはAmazonが運営しているクラウドコンピューティングサービスの一つです。Amazonが持っているCPU/GPUなどをオンラインで使用できるのでタスクの自動化に向いています。Numerai Computeノードをセットアップし、モデルをデプロイするまでを説明します。

1.AWSのアカウントを作成する。
AWSのアカウントの作成方法は**[本リンク](https://portal.aws.amazon.com/billing/signup "本リンク")**を参照ください。連絡先情報・クレカの番号が必要となりますが、新規登録者は無料枠の分までは無料です。

2.AWSの請求を有効にする。
**[AWSの請求を有効](https://console.aws.amazon.com/billing/home?#/paymentmethods "AWSの請求を有効")**にし、コードを実行できるようにします。公式曰く、月当たり5USD以下の費用がかかるそうです。

3.IAM ユーザーの事前設定。
**[IAM](https://console.aws.amazon.com/billing/home?#/paymentmethods "IAM")**(Identity and Access Management)とはAWS のアクセスを安全に管理するためのウェブサービスのことです。
アカウント作成時点では、ルート権限を持つユーザーが作成されますが、IAMユーザーの設定をすると、特定の権限を持ったユーザーを作成することができます。今回は、Numeraiに自動で予測を提出するためだけのユーザーを作成します。
まず、**[本リンク](https://console.aws.amazon.com/iam/home?region=us-east-1#/policies%24new?step=edit "本リンク")**を開いた後、JSONをクリックしてください。初期時点ではコードが入っていますが削除し、以下のコードをペーストしてください。

(*古いNumerai-cliを使用している方は、本部分が以下のコードと違う可能性があります。その場合は、以前のコードを削除し、以下のコードと置換してください。以前のコードのままだと、IAMの権限エラーが出て詰みます。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015710/28ef3134-e3fc-443f-7cef-ad7a7d6cfb66.png)



```json:json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "apigateway:*",
                "logs:*",
                "s3:List*",
                "ecs:*",
                "lambda:*",
                "ecr:*",
                "ec2:*",
                "iam:*",
                "batch:*",
                "s3:*"
            ],
            "Resource": "*"
        }
    ]
}
```
次のステップボタン（右下）を**二回**クリックすると、以下の画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015710/367c01cc-7cbb-3145-2385-b4a600ba42af.png)

本画面の名前の部分に、任意の名前（例えばcompute-setup-policy）を入れてください。こちらの名前を後で使います。

4.IAM ユーザーの作成
IAMユーザーの作成を行うために、**[本リンク](https://console.aws.amazon.com/iam/home?region=us-east-1#/users$new?step=details "本リンク")**から設定を行います。ユーザー名に先ほど設定した名前（例えばcompute-setup-policy）を入れ、プログラムによるアクセスにチェックを入れた後、次のステップを押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015710/b0b300a1-4754-1bbd-9a99-7b990c15d2f7.png)

既存のポリシーを直接アタッチを押し、先ほど作成した名前で検索してください。その後、チェックボックスにチェックをいれ、次のステップを**二回**押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015710/4a8af999-514c-6b04-1ad4-23839feb7ebd.png)

入力した後、ユーザーの作成を押せばIAMユーザーの設定は完了です。アクセスキー IDとシークレットアクセスキーが表示されるので、メモしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015710/10d481d3-f3f1-0db4-60fc-1904fe12a0f7.png)


##②Numerai APIキーの取得
Numerai APIキーは[設定](https://numer.ai/account "設定")から取得することができます。Create API Keyから
Upload submissionsにチェックを入れた状態でAPIキーを作成してください。

##③Python・Dockerの設定
Windowsユーザー向けの設定方法を説明します。
numerai-cliを動かすには、python,dockerが必要です。自動でインストールするスクリプトが用意されているので、windows10を利用されている方は以下のコードを入力してください。

```
powershell -command "$Script = Invoke-WebRequest 'https://raw.githubusercontent.com/numerai/numerai-cli/master/scripts/setup-win10.ps1'; $ScriptBlock = [ScriptBlock]::Create($Script.Content); Invoke-Command -ScriptBlock $ScriptBlock"
```
このコードがうまく動いた人は以下の手順は不要です。

私はwindows8環境なので、以下の手順でPython,Docker-toolboxを導入しました。
**特に**Dockerのインストールは多種多様なエラーが出ます。うまくいった例を説明しますが、環境によっては再現しないこともあることをご了承ください。

①Pythonのインストール
**[こちらのページ](https://www.python.org/downloads/release/python-392/ "こちらのページ")**からPython 3.9.2をインストールしてください。インストール後はPathを通してください。(個人によって異なりますが、例えば、C:\Users\USER\AppData\Local\Programs\Python\Python39\Scripts\ をPathに追加してください）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015710/3800dee6-b28d-981e-2cdc-968663b1634c.png)

②Docker-toolboxのインストール
Dockerのインストールは『非常に』エラーが起きやすいです。以下の手順でインストールしてください。

i)visualboxのインストール
**[こちらのページ](https://www.virtualbox.org/ "こちらのページ")**から最新版のVisualboxをダウンロードし、インストールしてください。
ii)Docker-toolboxのインストール
**[こちらのページ](https://github.com/docker/toolbox/releases "こちらのページ")**からDockerToolbox-18.02.0-ceをダウンロードし、インストールしてください。インストールするときに、Visualboxのチェックを**『絶対に』**外してください。(**[参考文献](https://cpptake.com/archives/476 "参考文献")**)
Gitのインストールは同時に行っても問題ありませんので、Gitにチェックを入れてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015710/c4cbcb7a-92b7-fc06-2c61-7136f27d028f.png)

**(このインストール方法に気が付くまで2日かかりました。Docker-toolboxからvisualboxをインストールすると、Numerai cliを使用できないので、必ずこの手順を守ってください）**

iii)docker-machineの設定
**docker quickstart terminal**を起動し、以下のコードを入れてください。

```
docker run hello-world
```
以下の画像のように表示されればDockerの設定は問題ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015710/9331b15d-78ea-1443-5445-21114067e999.png)

次に、Numerai computeで使用するdockerイメージの作成を行います。以下のコードを入力してください。

```
docker-machine rm default
docker-machine create -d virtualbox --virtualbox-cpu-count=2 --virtualbox-memory=4096 --virtualbox-disk-size=50000 default
```
＊Dockerが見つからない、などのエラーが出た場合は、パスが通っていないので、コントロールパネルからシステムの詳細設定を開き、環境変数→新規を押し、Pathを下図のように設定してください。
**(docker toolboxの保存場所は環境によって異なる可能性があります。私の場合はC:\Program Files\Docker Toolboxでした。）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015710/25f6c8bd-1833-af75-eca9-9fc7e6de3ce9.png)

＊＊ Docker daemon not running. Make sure you've started "Docker Quickstart Te
rminal" and then run this command again.
というエラーが出た場合は

```
docker-machine restart default
```
でdefaultを再起動してください。

それでもエラーが出る場合は

```
docker-machine env
```
を入力して出てくる、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015710/71e6fe8d-a422-f998-479d-bbe533e72755.png)




```
eval $("C:\Program Files\Docker Toolbox\docker-machine.exe" env)
```
を入力してください（環境によってこの部分は異なる可能性があります。）


これでdefaultのアクティブ化ができたはずです。（ACTIVEが＊になればOK)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015710/e1e8aa59-bc17-d7f2-3c0b-10dcf74907e4.png)

iv) pipとnumerai-cliのインストール
**[こちらのページ](https://www.python-izm.com/tips/pip/ "こちらのページ")**を参考にpipをインストールしてください。
pipを入れたら、

```
pip3 install numerai-cli --user
```
として、numerai-cliをインストールしてください。

##④numerai-cliの使い方
Docker quick start terminal上で"numerai --help"と打つと、使用できるコマンドリストが取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015710/5989e4d8-dbd4-a76b-a72a-adbf21274236.png)

numerai copy-example:Numerai運営が用意したexampleファイルをダウンロードできます。

```
numerai copy-example -e tournament-python3 
numerai copy-example -e signals-python3 
```
などとすることで、Numeraiトーナメント用のexampleファイルや、Signals用のファイルをダウンロードできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015710/14de4010-f401-de8f-5443-4707f5aceb21.png)

numerai doctor:numerai-cliの状態を取得します。正常なら、以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015710/fc5f9e97-d62b-c037-0065-7624e2a82f77.png)

numerai list-constants:デフォルトの状態を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015710/460c533d-5e63-1453-35af-d43251b1c7a6.png)

numerai node:DockerFileをAWSにアップロードするためのコマンドです。config,deploy,testをよく使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015710/24c1257f-c3b3-a902-9796-313e16d1f485.png)

numerai setup:Numerai cliとAPIキーを初期化するコマンドです。記事上部で用意したNumerai public IDやAWSのキーを保存できます。

numerai uninstall:Numerai cliに関連するファイル・AWSの設定などをすべてアンインストールします。

numerai upgrade:.numeraiフォルダにkeyファイルなどを格納します。

##⑤numerai computeを使用するまでの手順
i)```numerai setup```を実行し、Numerai public IDやAWSのキーを保存する。
ii)```numerai upgrade```を実行し、.numeraiフォルダに必要な情報を移す
iii)```numerai copy-example -e tournament-python3``` を実行し、tournament-python3フォルダを作成する
iv)```cd tournament-python3``` として、tournament-python3フォルダに移動する。
v)prediction.pyを開き、MODEL_CONFIGS内のNoneを自分のモデルのUUIDに変更する。
（UUIDの取得は[こちらから](https://numer.ai/models "こちらから"))
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015710/b2585289-8b47-71db-ff90-79241ec39986.png)
vi)```numerai node -m tit_btcqash_compute config -e tournament-python3 -s mem-md``` (tit_btcqash_computeの部分は個人によって異なります。モデル名を入れてください）を実行する。
（本コードは、tournament-python3フォルダのdockerfileを使用して、mem-mdで構成されたCPU/メモリーをAWSで構成する、というものです）
vii)```numerai node deploy``` を実行し、AWSに必要情報をアップロードする
viii)```numerai node test```を実行し、正常に動作するか確かめる。


i)~viii)が実行できればnumerai-computeを使用する準備はできました。
predict.pyを書き変えて自分のモデルをアップロードしてみましょう。pklファイルなどもpredict.pyと同じフォルダにおいておけば、自動でAWSにアップロードしてくれます。
なお、新しいモデルをアップロードするときは、

```
numerai uninstall
```
を実行してからi)~viii)の手順を実行するとうまくいくと思います。



それでは、よい日曜日を！





##参考リンク
[Numerai CLI wiki](https://github.com/numerai/numerai-cli/wiki/Amazon-Web-Services "Numerai CLI wiki")
[Numerai Computeの設定方法（動画版、英語）](https://www.youtube.com/watch?v=YFgXMpQszpM&ab_channel=Numerai "Numerai Computeの設定方法（動画版、英語）")
[Numerai CLI tutorial](https://docs.numer.ai/help/compute-tutorial "こちら")
[Numerai CLI　Medium記事](https://medium.com/numerai/building-the-numerai-network-af733c29d56f "記事")
[Youtube](https://www.youtube.com/watch?v=7NWAlQEay_w&t=2060s&ab_channel=Numerai "Youtube")

##あとがき
win8ユーザーが新しくなったNumerai-cliを使えるようになるまで、数多のバグと闘いました。
Numerai-cli作者のarkさんに感謝します。

本記事が参考になった方はNMRを投げてくれると嬉しいです。
NMR：0x0000000000000000000000000000000000021d96