edo1z blog

プログラミングなどに関するブログです

BTCFXの約定データで強化学習してみる (4)

google マシーンラーニングを使ってみたいと思います。お金はかかりますが、速いし、ハイパーパラメータのいいやつを探してくれるということなので、よさそうだと思っております。強化学習については、下記記事に色々書いてあります。

cloudplatform-jp.googleblog.com

ディレクトリ構成

google mlで使うには、gcloudコマンドで、google mlにモデルとジョブを送ってジョブを実行します。google mlで動作させるために、下記のようなディレクトリ構成にして、前回作成したenv.pyとbf2.pyを埋め込みました。bf2.pyは、model.pyに改名しております。model.pyはコードも若干変えました。

├── __init__.py
├── config.yaml
├── hyperparam.yaml
├── setup.py
└── trainer
    ├── __init__.py
    ├── env.py
    ├── model.py
    └── task.py

model.pyの修正箇所

下記を追加しました。kerasのh5fファイルを、dqn.save_weight関数でそのままgoogle cloud storageに保存することができないらしく、google mlのローカルに保存してから、それをgcsfsでコピーするようにしております。googleのサンプルコードでも同じようなことがしてありました。

def save_model(dqn, outdir):
    weight_name = 'dqn_{}_weights.h5f'.format(ENV_NAME)
    if outdir.startswith('gs://'):
        tmp_local_dir = '/tmp/bf'
        try:
            os.makedirs(tmp_local_dir)
        except:
            pass
        tmp_file_path = os.path.join(tmp_local_dir, weight_name)
        dqn.save_weights(tmp_file_path, overwrite=True)
        out_file_path = os.path.join(outdir, weight_name)
        with open(tmp_file_path, 'rb') as input_f:
            gfs = gcsfs.GCSFileSystem()
            with gfs.open(out_file_path, 'wb') as output_f:
                output_f.write(input_f.read())
    else:
        out_path = os.path.join(outdir, weight_name)
        dqn.save_weights(out_path, overwrite=True)

setup.py

setup.pyはこんな感じになっております。REQUIRED_PACKAGESに入れたいパッケージを書いておくと、pip installしてくれます。元々入っているパッケージは、ここに書いてあります。

from setuptools import find_packages
from setuptools import setup

REQUIRED_PACKAGES = ['pandas>=0.24', 'gcsfs', 'docopt', 'gym', 'keras', 'h5py', 'keras-rl', 'numba']

setup(
    name='bf',
    version='0.1',
    install_requires=REQUIRED_PACKAGES,
    packages=find_packages(),
    description='BF',
    include_package_data=True,
)

感想

BASIC_GPUという環境で動かしてみましたが、思ったより速くなかったです。というか、自分のローカルPCとほぼ全く同じ秒数で、マシンの起動時間等を含めるとローカルPCの方が速くなりました。。一応自分のローカルパソコンにもNVIDIAのGPUがあるので、そのせいなのかもしれません。それか実装がよろしくないのかもしれません。

tensorboard

tensorboardで結果を表示してみました。一番良さげに見える状態です。一応学習してるっぽさがなくはありません。

f:id:edo1z:20190226220927p:plain