Ryzen Threadripper 3970X 搭載機でバックテストをしてみた

新しいCPUを搭載したPCを購入したので、記事にしておきます。

スポンサーリンク

Ryzen Threadripper とは?

PCに搭載するCPUの製品名称です。 個人向けのハイエンドPCに搭載されるCPUの中でトップレベルの性能を誇っています。

Ryzen(ライゼン)

AMD社という半導体メーカーがリリースしているCPUシリーズに用いられているブランド名。
CPUというと Intel(インテル)社は知っている人は多いと思いますが、昨今、Intel CPUの競合として台頭してきたのがAMD Ryzenシリーズで、
処理性能がそこそこ良いのに加えて価格が安く、コスパが良いことから近年一気にシェアを伸ばしています。

Threadripper(スレッドリッパー)

Ryzenブランドの中でも、Threadripper と名のつくCPUは超ハイスペックな処理能力を求めるユーザー向けに用意されたシリーズです。
CPUコア数が圧倒的に多く、現時点ではCPU1個で最大32コア64スレッドを保有しています。(Threadripper 3970Xの場合)
クロック数も昨年リリースされたThreadripper 2990WXから十分に改善され実用性に耐えられるCPUになったと思います。

※3990WXが販売されるのをずっと待っていたんですが、 「3990WXは 2020年リリース予定」というニュースを見て、先が長そうなので諦めました。。

なぜ Threadripper 3970Xが良いか?

バックテストはCPU性能が重要

Threadripperに関し、レビュー記事では「CPUコアが大量にあっても用途がない」「ただのロマン」的なものをよく見かけますが、殊 MT5においてはフルで活躍します。

なぜかというと、MT5でバックテストを実行する場合、特にパラメータの組み合わせを最適化させる場合にはCPUのスレッド数が多い程、同時実行できるテスト数が増えるからです。
※MT4はシングルCPUしか使用不可(環境複製的な力技をすれば別ですが、最適化を分散環境では実施できない)

この最適化という処理は機械学習的な行為に近いので、本来はGPUが活躍しそうな領域ではあるのですが
MT5のバックテストはCPUベースでしか実行できないという問題を抱えているために、CPUを大量に積んだマシンは価値を発揮します。

Threadripper 3970Xは総合性能でも優秀

PassMarkのベンチマークソフトで、手元にある2台のPCのCPU性能を測定してみました。

左:Intel Xeon E-2176M (6コア 12スレッド)
右:Ryzen Threadripper 3970X (32コア 64スレッド)

左側でもハイスペックな方なんですが、、右側の結果が高過ぎて基準がよく分からなるくらいの差が出ました・・・

3970X側の Percentileが99%になっているのは、このベンチマークソフトの統計の中で、ワールドランキング上位1%以内 ということらしいです。恐るべし。

ちなみにPassMark社 HP上にあるCPUベンチマークランキングでも3970Xが首位でした。  ランキング内の3970X 平均スコアが 48,020になっていますが、手元の環境では50,486。
何度か繰り返しベンチマークテストを行うと、CPU温度が上がり48,000くらいになる時もあったので誤差の範囲でしょうかね。

https://www.cpubenchmark.net/high_end_cpus.html

スポンサーリンク

環境整備

ようやく本題。

3970X を積んだPCをバックテスト用端末としてセットアップします。
やることは単純で、 MT5をインストールした後にテスト用のエージェントを起動するだけ。 のはずだったのですが・・・ 単純にはセットアップ出来ませんでした。

MT5インストール

特に問題なし。 敢えて書くことも無いのでスキップ。

MetaTester エージェント設定

MT5をインストールしたら、ストラテジーテスター エージェントマネージャーを開き、テストで利用するエージェント数を指定します。

1エージェントはCPU1スレッドを利用します。 エージェントマネージャは自動でCPUスレッド数を認識し、最大設定数までを選択可能にしてくれます。
今回の場合、32コア64スレッドの端末なので、64エージェントまで指定できることになるのですが。

選べない。

32エージェントまでしか指定できません。

タスクマネージャを見る限り64スレッドを認識しているのに、エージェントの最大数が32。。 このままではせっかくのCPUの暴力度合いが半減してしまいます。

ちなみに、MT5のバージョンはBuild 2280。

※少し古いリリースバージョンのMT5で試したところ、64エージェントまで指定可能な状態になりましたが
途中からエージェントマネージャが開かなくなったり、なんとなく挙動が怪しかったので、Build 2280で動作するような回避策を検討。

回避策

何度かMT5を再インストールしたものの、やはりMT5エージェントは最大32まで。

やむを得ず、MT5環境を2つ用意してエージェントマネージャー自体を2つ起動。

├MT5_1
│ └エージェントマネージャー1
│   └32エージェント(port 2000~)
└MT5_2
└エージェントマネージャー2
└32エージェント(port 3000~)

各エージェントにはユニークなポート番号が割り当てられるように、重複しないポートのレンジで割当を行うことで64エージェント分を同時に起動することができました。

MT5環境を複数用意するには

MT5環境を2つ用意する際は、インストール x 2 でも良いですが、インストール済のMT5ディレクトリを複製するだけでもOKです。

データフォルダが %appdata% 配下に切り出されてしまい、コピーが面倒という場合は
terminal.exe を起動する際に /portable 引数をつけておけば、MT5インストールディレクトリ配下にデータフォルダも内包します。
起動の度に入力するのが面倒なので、ショートカットファイルを作成し 「リンク先」に引数追加、ショートカットファイルからMT5を起動すればOK。

エージェントを起動する

無事に64エージェントが起動しました。

その他設定

ローカルネットワーク内において、他のPC上にあるMT5からこのPC上のエージェントを使いたい場合は、ファイアウォールの受信規則を設定します。
※エージェントマネージャを2つ起動する場合、それぞれのアプリに対して設定が必要

バックテスト最適化を実行

稼働確認

バックテスト最適化を開始すると、64コアがフル稼働しています。

処理性能

Xeon E-2176M のPCと 3970Xの2台をローカルネットワーク内に配置。 都合 12+64 = 76コア同時使用で最適化を行いましたが、
前者の方が1セットで割り当てられるタスクをこなし切るまでに時間がかかってしまうために、3970Xの方は1セット終わる度に若干のアイドル時間が発生。
結果、適度にCPU温度が下がった(大体60℃~80℃くらい)せいか、64エージェント起動しても大きな性能劣化はありませんでした。

エージェント当たりの処理タスク数は、Xeon E-2176と大差なし。  3970Xは単一CPUの処理性能もかなり高い方なので差が開くかな?と期待したのですが。

この「1セット」のタスクの割り振りはMT5が自動で行うものなので、アイドル時間が発生していた3970X側にもう少し多くタスクが割り振られていれば
完了タスク数に差が出ていたのかもしれません。 この辺りの割り振りの最適化は、直近のMT5バージョンアップでも対策されていた部分だったはずなので、
今後も継続して改善されることを期待したいと思います。

ちなみにPC1台のお値段は・・・

某BTOメーカーで調達。 デスクトップPC1台で、なんと 800,000円!!!

しかし、同等論理コア数をIntel製CPUで実現しようと思うとXeon プロセッサを複数個搭載するような構成になってしまい、
1,000,000円は軽く超えることを考えると、3970Xのコスパは非常に良いのだと思います。

構成の概略はこんな感じ。

OS            : Microsoft(R) Windows10 Pro (64bit)
CPU          : AMD Ryzen Threadripper 3970X [3.7GHz/32Core/TDP280W] MOTHER  : ASUS PRIME TRX40-PRO [AMD TRX40chipset] MEMORY  : 128GB[16GB*8枚] DDR4-3200
SSD          :  Western Digital WD Black WDS200T3X0C [M.2 PCI-E SSD 2TB]
GPU          :  GeForce RTX2080Ti 11GB
POWER     : Corsair HX1000i 1000W/80PLUS Platinum

ちなみにGPUは別要件で使いたいがために搭載しました。MT5では出番が無さそうです。 GPUを安いのにすれば、100,000円くらいは安くなるはず。

余談

ハイエンドPCを調達する以外にもハードウェアリソースを用意する方法があります。
一応、それらも十分に検討した上で購入に至ったので、その辺の経緯も整理しておきます。

案1. MQL5 クラウドネットワーク使えばいいんじゃないの?

MQL5クラウドネットワークはとても便利で、今でも時々使用しますが、残念ながら使えないケースがあります。

MQL5.comの有償インジケータはよく出来た製品も多くあり、自作EAに組込みたいと思ったことが何度かありますが、この場合はクラウドネットワークが使えません。

目先にやりたいことが上記の課題を抱えていたので、この方法では問題解決できません。

案2. EC2とかIaaS環境使ったら?

IaaS環境で、必要なときだけ必要な量のリソースを使うという発想はとても正しいのですが、MT5環境+大容量のヒストリカルデータの整備までを1セットと考えた場合、
Vagrant + Ansible 等で環境デプロイの自動化をしようと思いましたが、

・環境デプロイ自動化のプログラム書く手間がかかりそう。それよりも売買ロジックを書くことに集中したい
・ヒストリカルデータが大容量のため、デプロイに手待ち時間ができそう
・時間当たりの単価が高くなりそう

等、悩ましい点も多く、却下。

案3. 安い物理PCでスケールアウトした方がコスパが良いんじゃない?

これが出来るところがMT5の魅力ではあるのですが、大量にハードウェアを持つのは運用管理が面倒(故障、修理とか)。
4Core 8スレッドのPCだったら、8台集めてようやく同等性能くらいになるので、狭い部屋に8台もPC並べるとかはちょっとキツい。
発熱量も1台のハイエンドPCよりも酷くなりそう ということで却下。

まとめ

無事、64コアをフルに使うことができました。

1コア当たりの実行タスク数が従来持っていたPCと差がないならば、 (12+64) / 12 = 6.3倍の処理量をこなせるようになったことになり、
仮に所要時間が12時間かかる最適化がわずか2時間で完了できるようになったと考えると、その日の内にロジックを修正して再テストまで行う事ができます。

休日にロジック修正して最適化を実行すると手待ちの間に休みが終わってしまい、翌週の休日に改めて修正したロジックを見直すためには
脳みそのワーキングメモリに一週間前の情報を復元しなければならず、これが結構ストレスになって開発が進まない という問題がクリア出来るので、この時短はとても効果が期待できそうです。

もう一台、同じものを買えば (12+64+64) / 12 = 11.6倍速ではあるのですが、家庭用電源で耐えられる消費電力量等も意識しないといけないレベルになってくるかもしれません。
3970Xフル稼働で400~500W前後を消費する(電子レンジくらい?)という記事を見たことがあり(実際に測ってない)、
これに空調や他のPC、作業ディスプレイ(65インチ+32インチ)等トータルでみると、もう1台は電力的にちょっと厳しいかも。

スポンサーリンク
おすすめの記事