師走の岡山

10日に書いたんですが、大都会岡山 Advent Calendar 2023の空いた日を埋めてタイムスリップ感を出してます。

adventar.org

 

コロナ禍の間に忘年会などの年末行事の多くが中止になっていたと思います。

4年ぶりでしょうか。岡山で恒例の行事が行われました。

といってもいつもの「座」ではなく会場は岡山城というスペシャルな演出でした。面倒な準備を粛々と仕込んで頂いたスタッフに感謝ですね。

 

gbdaitokai.connpass.com

bonenkaigi.connpass.com

 

詳細はtogetterにまとめられております。

togetter.com

 

私は個人的に最近ゲームAIの人なので、先月話題になったオセロの弱解決の話を入れてそこから昨今の将棋界の話題に入る前にTime Upでした。(ワザとじゃないのよ)

夜枠が空いていたら入れようかと思ったのですが、岡山城でのプレゼンも制限時間いっぱいまで大勢が多様なネタを持ち込んでやっておりましたので出番なしとなりました。

終盤の部分はざっくり言うとオセロはトップ勢の皆は薄々引き分けと感じていて引き分けの結論を得た。将棋界は皆薄々先手有利と認識が固まりつつある。今年の電竜戦は持ち時間で倍ハンデをつけたが相変わらず先手有利は変わらない。今後大会運営としてどうしたらいいのか頭を痛めているというオチでした。(そのうち細かいBlogにします)

 

othelloに関しては詳しい記事があるのでリンク置いておきます。

qiita.com

 

今年の電竜戦本戦A級の勝敗表は以下のところです。

denryu-sen.jp

 

翌日はQuineのネタをPythonでやってみようと

s="s=\"\";print(\"%s%s\"%(s,s))";print("%s%s"%(s,s))

と一行書き始めて停滞しました。誰か後よろしく。

 

10日に書いたんですが、大都会岡山 Advent Calendar 2023の空いた日を埋めてタイムスリップ感を出して終わりにします。

 

明日は皆さん楽しみましょう。(8日に書いた体で終わる)

 

 

 

 

 

機械学習向けのノートPCの話

なんか知らんけど7月に書いておいたものがそこそこアクセスされている。

現在最もアクセス数の多いページである。

bleu48.hatenablog.com

 

正直言ってマニア向けなので外付けのGPUってのはあまりお勧めしない。

一通り一般的なハードウェアを触って状況を理解した上で、割り切って選択するくらいのものである。

まぁ、ネタ的には面白い。実用性は求めてはダメだ。

 

で、一般的にはお勧めしていないがGPU搭載のノートPCが売られており、ゲーミングノートPCというジャンルを確立している。

出張先で見せなければならない人はこちらが選択肢だろう。

個人的にも仕事的にも何台か購入したので知見をまとめておく。

もちろん、機械学習用なのでゲーム目的ではない。

 

1.GPUはなにはなくともNVIDIA

AMDもそろそろ選択肢に入ろうとしているがまだNVIDIA一択である。

 

2.CPUよりGPU

機械学習GPUを使うのでGPUスペックを優先すべき。CPUがボトルネックになるほどの構成はさすがに見たことが無い。

 

3.熱設計の話

これは本blogでも散々書いているネタであるが、そもそもゲームの負荷ってのは全負荷ではない。フレーム落ちしない程度の負荷しかかけないのでCPUにしてもGPUにしても概ね50%程度である。この状態のベンチマークに最適化されたものを100%の負荷に晒すと熱暴走することは結構ある。個人的には同筐体を使った上位スペックが存在するか確認して熱設計に余裕を持っているかどうか確認する。

 

4.電力設計の話

上記の話と連動する。NVIDIAGPUにしてもモバイルモデルは電力設計において幅を持たせている。

例えば下記記事ではRTX3060のモバイルGPUは60~115Wの幅で設定されている。

NVIDIA、ノート向けGeForce RTX 30シリーズ発表。デスクトップ版RTX 3060も - PC Watch

60Wと115WではCPUがそうであるように実行性能は大差である。2倍とまでは言わないが1.6倍くらいは覚悟した方がいい。更に言うとすでに手元に一台あるのだが120W設計のRTX3060も実在する。

正直言って別の型番付けた方が良いくらい性能が異なる。と言っても出荷された半導体的には同スペックと言うことだろう。

 

ちなみにであるが、デスクトップとモバイル版ではGPUの型番と性能差が大きいと最近話題となっている。

【特集】同じ「4060」と「4090」だけど……GeForceのデスクトップとノートはどのぐらい違う? - PC Watch

RTX4060ではデスクトップとモバイル(の上限)で微差であるが、TRX4090では全くの別物と言って良い。

実はRTX3060が面白くモバイルの方がCUDAコア数が多く、電力やクロックが低く

ベンチマークは僅差という状態である。上記で書いた120WのモバイルRTX3060だとデスクトップ版を上回るケースも珍しくない程度のパフォーマンスを誇る。

デスクトップのRTX3060が170Wなのだから差が小さいのも納得である。

RTX4060はモバイルの上限がデスクトップスペックである。

 

ということで、RTX3060やRTX4060くらいのものがモバイル用ではお勧めである。上位は名ばかり高額品でコストパフォーマンス的に厳しいし、下位は性能的に勿体ない。このレンジならデスクトップ用と遜色が少ない。ただし、熱設計が上限値に近いものに限る。下限近い設計のものだともちろん残念な性能しか得られない。

ただ、この辺の情報はあまり流れていない。

カタログスペックでは記載されていない。なんとかならないものだろうか。

 

もちろん、熱設計が甘いノートPCではCPUの性能も有効にならない。

価格comにロマンに溢れたASUSのPCのレビューがあるのでリンクを残しておく。

薄型モバイルPCにi9の13900Hプロセッサ(45W TDP)である。

価格.com - ASUS Vivobook 14 X1405VA Core i9 13900H/16GBメモリ/1TB SSD/14型ワイドTFTカラー液晶/WPS Office 2 Standard Edition搭載モデル X1405VA-LY127W [インディーブラック] レビュー評価・評判

HXプロセッサ(55W TDP)まで積んだらネタで買ってしまうかもしれない。

オープンセミナー2023@岡山

昨年は8月オンライン開催でした。

2022年8月近況 - 48's diary

 

コロナ禍のため3年オンラインになっていましたが,2023年久しぶりに対面開催を行いました。

私は例によって会場手配の担当(要するに裏方)です。

オープンセミナー2023@岡山

 

2008年の初回開催で80名程度でしたが,今年はコロナ禍明けで申込数があまりのびなかったので少し心配していたのですが

オープンセミナー2023@岡山 - connpass

 

 

隠密活動しなければならない事情の方も多かったようです。

 

一番多かったときで200人超えていたので100人切るのは初回以来でしょうか。

個人的には楽に全発表を聞けて,これはもっと多くの若者に聞いて欲しかったなという感想です。生存バイアス高めでしたが出会いで人生変わるエンジニアコミュニティの話が幾つもありました。迷いがある人にこそ聞いて欲しかったですね。

 

例によって懇親会は大盛り上がりでした。

会場係は後片付けがあって懇親会のスタートに間に合いませんでしたので懇親会集合写真には写らずでした。

もちろん,懇親会の詳細は記録に残せません。

 

 

まとめは毎度されているようです。

オープンセミナー2023@岡山 まとめ #oso2023 - Togetter

 

また,比較的近いスケジュールで年末の合同勉強会および岡山城での忘年会議が予定されているようです。

合同勉強会 in 大都会岡山 -2023 Winter- - connpass

忘年会議2023 in 岡山城 presented by finet - connpass

個人的にも忘年会ネタのために一年生きているわけですから参加できるようスケジュール調整したいと思います。

 

1ファイルマッチ体験会反省会

先日からアナウンスしておりました1ファイルマッチ体験会が先週末無事終わりました。

報告が遅れましたが簡単にまとめておきます。

 

1ファイルマッチ体験会 - 48's diary

1ファイルマッチ体験会1 リーグ表

1ファイルマッチ体験会1 勝敗表

 

10チームで総当たり、9回裏表の計18回戦となりました。

上位は全勝の地ビール、15勝3敗のshogi686_sdt5、13勝4敗1分の真れさ改1ファイル、13勝5敗のsample4-5aと手前味噌ですがうちの子らが上位を占めてしまいました。

真れさ改もノーマルれさ改に比べ相当強かったですね。作者の池さんもバグがあるのは分かっているのでそのうち修正したいと仰っていたので修正されたのかもしれません。

 

うちの子らの順位はもう少し分散すると思っていたのですが、ノーマルれさ改の位置から考えても皆さんもう少し頑張りましょうといったところでしょうか。

floodgateレートで地ビールは2500くらい、sample4-5aが1500くらいですので目標にして頂ければと思います。LesserKaiは700くらいでしたっけ?

 

sample4-5aの方は過去のサンプル含めて公開しておきます。

shogi-eval/sample4-5a.py at master · bleu48/shogi-eval · GitHub

 

ただ、これはプログラム簡便のため探索深さ固定となっており、持ち時間が少なくなっても慌てて指すことはなく時間切れをします。

真面目に大会に出るなら対応しましょう。

 

本体験会でもsample4-5aの時間切れ負けは2度あり、特に9回表の時間切れの対応が遅れたために9回裏の開始に間に合わず異常負けとなったところです。

対戦エンジン的には9回裏の負け後に9回表の最後の指し手を返しておりました。酷いですね。

 

簡単にsample4-5aの改善点を説明しておきます。

探索部は体験会前に公開したネガアルファ法です。

 

アルファベータ法で結構探索時間に効いて来るのが候補手のオーダリングです。

今回簡単に実装してみました。(雑すぎると言われそう)

以前探索前に手を選ぶので駒を取る手や成る手を上位にする話がありましたが、同じ考え方を使ったオーダリングです。Pythonでリストの並べ替えはラムダ式を使えば簡単に一行で書けます。

    legal_moves = list(board.legal_moves) # いわゆる合法手リスト
    legal_moves = sorted(legal_moves, reverse=True, key=lambda x:x & 0b111100000100001110000000) # 取る駒,成るフラグ,打ち駒の部分をフィルタして逆ソート
    for m in legal_moves:

 

次の肝は評価関数です。

以前からサンプルを出していますがNNUE型のファイルを直接読んでいます。

今回は多方面で愛用されておりますKristallweizenを用いました。

デフォルトのモデル型なら以下のままで読めるはずです。

nn_data = open("eval/nn.bin", "rb").read()
i = 178 # NNUE型の評価関数の特徴表示文字列長(デフォルト値)
bias1 =  array( unpack_from("<"+str(256)+"h", nn_data, 16+i) )
weight1 = array( unpack_from("<"+str(256*125388)+"h", nn_data, 16+i+256*2) ).reshape(125388,256)
bias2 =  array( unpack_from("<"+str(32)+"i", nn_data, 16+i+2*(256+256*125388)+4) )
weight2 = array( unpack_from("<"+str(512*32)+"b", nn_data, 16+i+2*(256+256*125388)+4 + 4*32) ).reshape(32,512)
bias3 =  array( unpack_from("<"+str(32)+"i", nn_data, 16+i+2*(256+256*125388)+4+ 4*32+32*512) )
weight3 = array( unpack_from("<"+str(32*32)+"b", nn_data, 16+i+2*(256+256*125388)+4+ 4*32+32*512 + 4*32) ).reshape(32,32)
bias4 = unpack_from("<"+str(1)+"i", nn_data, 16+i+2*(256+256*125388)+4+ 4*32+32*512 + 4*32+32*32)[0]
weight4 = array( unpack_from("<"+str(32*1)+"b", nn_data, 16+i+2*(256+256*125388)+4+ 4*32+32*512 + 4*32+32*32 + 4*1) )

 

そして盤面評価ですね。

特徴ベクトルは他の関数で作っています。k0、k1は自玉敵玉の位置、fv38は玉以外の駒の位置、fc38qはそれを相手から見たものです。

これらが入力となり、あとはnumpyを使った簡単なニューラルネットワーク構成です。

つまり、差分更新やSIMD演算などのNNUEの特徴は生かしていません。

但し入力ベクトルが81×1548の長大なサイズに対して38個所に1が立つだけのものですので,これを38巡のループにする程度の処理をしています。

def eval(board): # NNUE型の評価関数(キャッシュや差分更新など無し)
    k0, k1, fv38, fv38q = fv40(board) # 特徴ベクトルの取得
    x = bias1.copy() # 手番側特徴
    for j in fv38:
        x += weight1[k0*1548 + j] # 手番側一層目
    x2 = bias1.copy() # 相手番特徴
    for j in fv38q:
        x2 += weight1[k1*1548 + j] # 相手番一層目
    x = append(x,x2).clip(0,127) # 結合してクリップ(Clipped ReLU)
    x = ( (bias2 + weight2.dot(x) ) // 64).clip(0, 127) #二層目
    x = ( (bias3 + weight3.dot(x) ) // 64).clip(0, 127) #三層目
    x = bias4 + weight4.dot(x) #四層目
    return (x // 16)

 

一応お断りをしておきますと、PythonC++では負の整数除算が異なりますので正確にはNNUEと同じ値になるわけではないです。オーダリングの雑さ加減から比べたら可愛いものです。気にしないでいいと思います。

 

次のイベントまでに切れ負けしないような処置と探索部の工夫を加えようかとは考えています。

あ、それから重要な反省点ですが、新参者歓迎です。

気楽にプログラム作ってみてください。

 

---

追記:

sample4-5a等のファイル名については適当に更新しているので細かく気にしないで下さい。一般的なソフトウェア開発と異なり、新旧バージョンの比較対戦などを頻繁に行うためにgit管理などが適さないためどんどんファイル名を付けていっているだけです。

4も探索深さ4固定の意味でもありますが、また変わるかもしれません。

---

追記2:

numpyの処理はnumpyのバージョンやCPUアーキテクチャによって結構処理速度が代わることが確認されています。もちろんnumpyのバージョンは新しい方が良く,CPUは廉価化したZen3や最新のZen4などAMDが何故かコストパフォーマンスが良い感じです。

手元計測ではRyzen 5 5625Uで12knps程度,Ryzen 9 7950Xで20knps程度は出るようです。インテルは最新世代のものでこれらの間の値です。

CPUもPythonもnumpyも年々高速化されていますので来年にはもっともっと速くなっているかもしれません。

もちろん,地ビールはGo言語実装ですのでこれより一桁以上高速で,やねうら王やshogi686_sdt5などの高度なC++実装は更に数倍速いです。

1file match(仮)の参考資料4(ネガアルファ法)

1file matchというのは下記の経緯で私が考案した初級者歓迎部門の新設案です。

1file match(仮) - 48's diary

1file match(仮)の参考資料 - 48's diary

1file match(仮)の参考資料2(数行でレートを1300以上上げる) - 48's diary

1file match(仮)の参考資料3(駒得評価関数) - 48's diary

1ファイルマッチ体験会 - 48's diary

 

思い付きで弄ってましたが短いサンプルプログラムを作るのは好きな方でプチ実験的なものは多数作っています。

 

前回、駒得評価関数を実装しましたがその際Min-Max法のサンプルは沢山あるとコメントしてますが適当なものを探しておきました。

 

Algorithms with Python / ミニマックス法 (nct9.ne.jp)

参考文献に松原先生の著書がある辺りがミソです。

 

で、自分で実装したものが以下です。

MIN_VALUE = -32000
MAX_VALUE = 32000
SEARCH_DEPTH = 4
 
# 参考:ネガアルファ法 http://www.nct9.ne.jp/m_hiroi/light/pyalgo25.html
def negaalpha(depth, board, alpha, beta):
    global nodes, start
    if board.is_game_over(): # 負け局面は即リターン
        return -30000, "resign"
    if board.is_nyugyoku(): # 勝ち局面も即リターン
        return 30000, "win"
    if m := board.mate_move(3): # 三手詰みも即リターン
        return 30000, move_to_usi(m)
    if depth <= 0: # 残り探索深さがなくなれば評価値を返す
        # global nodes
        nodes += 1 # 評価した局面数をカウント
        v = eval(board)
        return v, ""
    #
    value = alpha # MIN_VALUEでもいいんだけど
    move = 0 # 以下のループが全部すり抜けたとき用の初期化
    pvm = ""
    legal_moves = list(board.legal_moves) # いわゆる合法手リスト
    for m in legal_moves:
        board.push(m)
        if draw := board.is_draw():
            v = [0,0,-28000,28000,-28000,28000][draw]
            pv = ""
        else:
            v, pv = negaalpha(depth - 1, board, -beta, -value) # depthを一つ減らしてαβを符号を変えて入れ替えるのがミソ
            v = -v
        board.pop() # 将棋はループ用に手戻しするが,ゲームによっては盤面コピーして毎回捨てるほうが速い場合も
        if value < v: # ネガマックス法 : 大きな値を選ぶ
            value = v
            move = m
            pvm = pv
            if depth == SEARCH_DEPTH:
                lap_time = time() - start + 1e-6
                print('info nps {} time {} nodes {} score cp {} pv {}'.format(
                    int(nodes / lap_time), int(lap_time * 1000), nodes, value, move_to_usi(move)+" "+pvm), flush=True)
        if value >= beta: break # ネガアルファ法 : 規定値外があれば打ち切る
    return value, move_to_usi(move)+" "+pvm

def go():
    if board.is_game_over():
        return 'resign'
    if board.is_nyugyoku():
        return 'win'
    if not board.is_check():
        if (matemove:=board.mate_move_in_1ply()):
            print('info score mate 1 pv {}'.format(m:=move_to_usi(matemove)))
            return m
    global nodes, start
    nodes, start = 0, time()
    value, move = negaalpha(SEARCH_DEPTH, board, MIN_VALUE, MAX_VALUE)
    lap_time = time() - start + 1.0e-6 # 0除算エラー対策で微小値を足してある
    print("info time", int(lap_time * 1000), "depth", SEARCH_DEPTH, "nodes", nodes, "nps", int(nodes / lap_time), "score cp", int(value), "pv", move)
    return move.split()[0]
 
実装したのはアルファベータ法の亜種と言うか実装では主流になっているネガアルファ法です。評価値を返す際にアルファベータも含めて符号を変えているのがミソですね。
 
ちょっと工夫しているのは探索途中の読み筋を表示してみたりしました。
そのために評価値と読み筋という二つの値を再帰的に渡しています。
また、探索ノード数や時間当たりのノード数なんかも慣例的に表示させているので同様の機能のためにglobalでノード数および時刻を保有しています。
今までは対局中GUIが味気ない感じでしたが、少しは探索過程が見られて楽しくなります。
 
---
追記:
先月山岡さんの法もアルファベータ法のサンプルを出されていましたので、ちょっと独自性を積むまでこちらは保留しておりました。
同様に御参考にしてみて下さい。こちらも実装はネガアルファ法の形です。
 

1ファイルマッチ体験会

電竜戦の方で9月24日21:00より1ファイルマッチ体験会を行います

電竜戦

体験会ですので,参加費もありませんし表彰もありません。

ただ,対戦してうまく動くことを確認して貰ったり本戦などの準備に使って頂ければ充分です。

勝ち負け気にせずに棋譜を残したという体験をして頂ければと思います。

 

1file matchというのは下記の経緯で私が考案した初級者歓迎部門の新設案です。

1file match(仮) - 48's diary

1file match(仮)の参考資料 - 48's diary

1file match(仮)の参考資料2(数行でレートを1300以上上げる) - 48's diary

1file match(仮)の参考資料3(駒得評価関数) - 48's diary

 

半日あれば強い弱いは度外視すれば参加は可能かと思います。

皆さんよろしくお願いします。

 

私の方は賑わしとして色々と準備をしており以下のようなエントリーです。

 

1.地ビール

2018年末くらいからフルスクラッチ開発しているGo言語の将棋エンジンおよびそれを使った簡易的な対戦プログラム。

約1600行。

第29回世界コンピュータ将棋選手権では改良型Multi Ponderシステムのコア部分として採用。

電竜戦の体験会で謎のVTuber相手に勝利を修めたり,floodgateでYSSに勝利したり個人的な満足がモチベーション。

 

2.sample4-5a

1file match参考資料用に作られたサンプルプログラムの派生バージョン。

おいおい公開予定。

開発言語はPython

cshogiやnumpyを用いて全体で150行程度の簡易なプログラムだがLesserKaiには勝利する。

 

3.shogi686_sdt5(招待枠)

第5回電王トーナメントで当時から1ファイル開発として個人的に注目していたプログラム。

製作者にお願いして今回招待枠としてエントリー,操作は私が行います。

C++の標準ライブラリのみを用い,尚且つ1ファイル構成と言う潔さ。

GitHub - merom686/shogi686_sdt5

第5回 将棋電王トーナメント | ニコニコ動画

 

勝った負けたより戦ったことがあるという体験にこそ価値があると思います。

是非御参加下さい。

 

ーーー

追記:

今なら自作プログラムで「すいしょう」に勝ったと言えるビッグチャンスかもしれません。

 

 

APUでDirectML

APUと言うのはCPUパッケージ内にGPUを搭載したものをAMDがそう呼称してから始まった。2011年である。

Intel互換CPUを扱っていたAMDRadeonなどのGPUを扱うATI社を買収したことから生まれた。同タイミングでIntel社もそれまでチップセット側に搭載していた簡便なGPU機能をCPUパッケージ側に移動した。所謂iGPUである。そして現在まで続く。

 

個人的には2012年の日本AMD本社でのブロガー勉強会が印象に残っている。私も古くからPVの少ないブロガーではあるのでエントリーさせて頂いた。土産にAPUと聞いていたがマザーボードも付いてきた。(対応マザーがまだ少ないので入手できないと意味が無いから付けたとのことでした)

bleu48.hatenablog.com

 

その昔に3DNowやらMMXやらを使ってMP3を扱うような遊びをしていたので、こいつも取り扱えるかと思いきやとてもハードルが高く結局ソフトウェア開発には繋がらなかった。

 

で、昨今のAPUであるが今はOpenCLやVulkanで叩きやすくなっている。

今回はさらにMS社が扱いやすくしてくれているDirectMLから使ってみることにする。

といってもPythonから呼ぶライブラリが変わるだけでなんてことはなかった。

 

1.Onnxruntime

onnxruntime-directml · PyPI

なんてことはなくPyPIからpipコマンドでインストールして動く。

CPU動作のonnxruntimeやonnxruntime-gpuとわずかにオプションの扱いが変わる程度である。

具体的にはonnxruntimeではその実行バックエンドのことをproviderと呼ぶがそれを指定する以下の部分である。

providers=['DmlExecutionProvider']

 

2.PyTorch

torch-directml · PyPI

こちらはβ版であるので少し慎重に扱う。自分でビルドすれば最新版が扱えるがβ版のバイナリは特定バージョンのみで供給されている。そのうちPyTorch本体に取り込まれる可能性もあるとのこと。

また、ソースレベルでインポートする宣言

import torch_directml

やデバイス指定など

    device = torch_directml.device(torch_directml.default_device())

は変更する必要があるが概ねそれくらいで大概のプログラムは動く。

 

で、重要なのが実行速度であるが、これは同じAPUで扱う限りCPU動作より1~3倍くらい速くなった。速くなるためにはCPU‐GPU間の連携がうまくいかないといけないが小さな計算を高頻度で切り替えるとオーバーヘッドが大きくなって旨味が無い。こういうったアクセラレータはそのハードウェアに合わせたある程度の規模で行うことが重要である。もちろん、本格的なGPUを使うと100倍とか速くなるので本件ちょっとしたものでしかない。

 

ところで、昨今生成系AIと呼ばれる大型の推論モデルを動かすには巨大なGPUメモリが必要とされている。APUはメインメモリ内にビデオ用のメモリを確保するため専用GPUより遅いが、設定如何では大きなビデオメモリを確保することが可能である。(そもそもメインメモリがビデオメモリより仕様上随分遅い。)確保量もマザーボード側の設定が可能かどうかに依存する。(起動後に動的に変更できないのか気にはなる)

gigazine.net

 

こういうのも動くという曲芸であって速度的には非常に遅いのであまり期待しない方がいい。上記のとおりAPUだと精々CPUの数倍しか出ない。

 

ということでAPUで少し遊んでみた。一応無いよりマシといったところである。

毎度の注意点であるが、CPUパッケージ内の簡易なビデオ出力機能であるのでここに100%の負荷をかけるのは恐らく設計外の利用方法になる。昨今オーバーヒートでクロックを下げる仕組みはあるがこの部分の対応が弱い印象があり、つまりフリーズする。過剰に期待せずちょっと使えば少し幸せになるかもしれないくらいの機能と思った方がいい。

ーーー

追記:

現在最強のAPUがデスクトップではRyzen7 5700Gである。2万5千円くらいでZen3の8コアだから普通のCPUとしてみてもコストパフォーマンスが高い。

ノートPC用のZen4のAPUが出つつあって7840HSとか7940HSとかである。この辺はまだ高額過ぎて触れていないが前世代より若干強そうである。7840Uは早く普通のPCに搭載して頂きたい。

デスクトップ用のZen4にも2コアだけGPUが搭載されていてAPU的に使えるがこれは無いよりマシ程度なもので更に期待してはいけない。8コアくらい積んだ上に廉価化するのを期待する。

ーーー

追記2:

某書籍で参考にされることが多いpython-dlshogi2ですが

GitHub - TadaoYamaoka/python-dlshogi2

こいつもonnxruntime-directmlで動きます。

onnx_player.pyのここだけ変更すれば終わりです。

DirectMLに関してはiGPUとdGPUの両方があれば選択的に使えるのでオプション有効にしてあります。(それとCPUも)

    # モデルのロード
    def load_model(self):
        if self.gpu_id >= 0:
            self.session = onnxruntime.InferenceSession(self.modelfile, providers=['DmlExecutionProvider'], provider_options=[{'device_id': self.gpu_id}])
        else:
            self.session = onnxruntime.InferenceSession(self.modelfile, providers=['CPUExecutionProvider'])