Go 1.22のrange over int

今月リリースされたGo 1.22でrange over intと言う拡張と言うか表記表現が加わった。

 

よく使われるforループは以前以下のような書き方をしていた。

    for i := 0; i < N; i++ {
    // ループの中
    }

iがループ変数で0からN-1までN回のループとなる。

Pythonなどでは既にある記法であるが以下のような表現が可能になった。

    for i := range N {
    // ループの中
    }

ベンチマークなどのループ変数のiを参照しないケースであれば,さらに以下のように省略も可能である。

  for range N {
    // ループの中
    }

 

ということで少し試してみた。

以前から制作している将棋エンジンの対応可能なループを全てrange over intに書き換えてみたところ,ベンチマーク上は特に変化が無かった。

整数の固定ループ化で速度向上を期待していたところ微妙なところむしろ遅くなった印象である。

 

心当たりはループ変数の扱いの変化である。

Go 1.22ではforループ時のループ変数を別アドレスに取るように変更になった。聞きかじったレベルの理由としては,Goでよく実装されるループ中のgoroutineでループ変数を参照する場合参照時には次のループに入っているケースが多く,よくある対応としてループ内変数に一時保存して参照しなくてはならない。この対応を不要にするためにアドレスを個々に与えているようである。

しかしながら,これをやってしまうとN回ループにN個の整数を別アドレスに確保する,つまりリスト生成をしてしまうことになる。せっかくの高速化チャンスである固定ループが台無しになっていると思われる。

 

まぁ,Goの使われ方を考える限り間違った対応でもないしこのレベルの速度を気にするのはHPC分野の人くらいだろう。Goでコーデックの類も書かれているらしいが気にならないのだろうか。

 

メモ化再帰とデコレータ

何故か知らないが土曜の夜に妙なキーワードがトレンド入りしていた。

 

 

プログラミングコンペが行われていた時間らしく同スキルを求めるような出題であったようである。詳しくは知らない。

 

せっかくの機会なので簡単に復習しておく。

Pythonには鉄板のメモ化ライブラリが存在する。

functools --- 高階関数と呼び出し可能オブジェクトの操作 — Python 3.12.2 ドキュメント

 

from functools import cache

@cache
def fib(n):
    if n < 2:
        return n
    else:
        return fib(n - 1) + fib(n - 2)

for i in range(40):
    print(fib(i))

 

キャッシュサイズに制限を加えたければlru_cacheを使うと良い。

上記は簡単なプログラムであるが@cacheのデコレータの部分をコメントアウトするとどういう挙動になるかどうか試して頂きたい。

 

フィボナッチ数列再帰呼び出しで典型的な課題であるが,数学的な定義でプログラミングすると上記のようになる。メモ化されていないとそれ以前の数列の値を再帰的に計算しなおすことになるがこれが不変であることからキャッシュに保存しておくことで劇的に速くなる。

 

メモ化情報を揮発性のRAMで残すのが上記の手法であるが,不揮発性のストレージなどに残す場合もあり,こういった場合はメモ化の永続化と言われる。一般的にはKVSのデータベースが使われることが多い。

ゲームAI界隈だと同じ局面が何度も見られた場合に以前の計算結果を流用するという意味で,定跡データベースというものがこれに当たるが,こちらは対戦前に計算しておいて溜めておくという計算リソースの前借という表現が適当であろう。

 

キャッシュが何をしているかと言えば,(ほぼ)同等コードが下記のようになる。

 

def cache2(f):
    table = {}
    def f2(*args):
        if not args in table:
            table[args] = f(*args)
        return table[args]
    return f2

@cache2
def fib(n):
    if n < 2:
        return n
    else:
        return fib(n - 1) + fib(n - 2)

for i in range(40):
    print(fib(i))

 

ついでにデコレータも復習しておこう。

デコレータも上記のように自分で作ることが出来るが意味は下記のようになる。見通しが悪くならず後置してよければデコレータを使わずに同じ意味だ。

def cache2(f):
    table = {}
    def f2(*args):
        if not args in table:
            table[args] = f(*args)
        return table[args]
    return f2

def fib(n):
    if n < 2:
        return n
    else:
        return fib(n - 1) + fib(n - 2)

fib = cache2(fib)

for i in range(40):
    print(fib(i))

 

どちらかと言うとBlogにコードを貼る復習になった感じである。

探索無しのゲームAIの話

ゲームAI界隈で話題になったらしい。

またDeepMindに追いつかれた気分です。

arxiv.org

 

機械学習で完成したモデルの強さが探索無しでチェスのグランドマスター級だそうです。

将棋の方はほぼ一年前なのですが,うちの二番絞りが探索無しでプロ棋士級になっています。

コンピュータ将棋界隈で恐らく最も大きな深層学習モデルを使っており最高精度を誇ります。

 

bleu48.hatenablog.com

bleu48.hatenablog.com

 

最高到達レートで2949ですので人類でこのレベルになるのはプロ級しかおりません。

3000超えたプレイヤーも見たのですが次のときにはBANされていたのでソフト指しなのでしょう。YouTuberで2800台の方はおります。

奨励会時代の藤井さんが一瞬近い値を出したとかいう話は真偽不明ですが噂で聞いたことがあります。

 

旧型PCの0.1秒未満・探索無しでこのレベルに到達してしまうほどには機械学習の教師データも世の中に揃ってきたと言えます。強化学習の練習問題としては次を探す時期に来たのかもしれません。

そう言えば囲碁の方はまだ欧州上位級(2,3段?)でしたね。

 

ちょっと追記しておくと,floodgate上では上記の探索無し二番絞りのレートはそれほどでもありません。理由は明白で将棋の場合最終盤で詰む詰まないを読むのは古典的な探索AIの得意とするところで随分古くから人間を凌駕しており,これがあるかないかで全く終盤の強さが変わります。(これは将棋強い人なら分かると思います。最終盤の古典AIは間違えません。)

ということで,これが全く無いモデルでもそこそこ戦えているのが驚異的と見るのが正確な表現かと思います。探索無しで詰将棋を結構解くことが出来ている二番絞りのモデルは正直オーパーツ的ですらあると言えます。

 

対AI戦でレートがあまりよくなくても対人戦ではそこまで相手の終盤力が無いので勝てると言う感じでしょうか。チェスは終盤の方が簡単になるのでそこは楽ですね。

第2回マイナビニュース杯電竜戦ハードウェア統一戦(予選)

本年度は多方面で過労気味で本戦のまとめも遅れてしまいました。

第4回電竜戦本戦 - 48's diary

大手メディアでも本まとめの先手勝率に関して取り上げて頂いたようで将棋界での反響も大きいものかと思います。

 

で,ハードウェア統一戦に関して昨年度は運営準備に走り回りなんとか開催にこぎつけた感じでした。

電竜戦マイナビニュース杯ハードウェア統一戦開幕 - 48's diary

結果的にも様々な戦型を含む多くの棋譜を残せたこともあり非常に有意義な大会であったと個人的にも満足しています。

第1回マイナビニュース杯電竜戦ハードウェア統一戦の戦型分析 - 48's diary

多くの将棋関係者からも後々になりましたがコメント頂きました。

 

問題点と言うほどのことでもないのですが,運営メンバーである私が決勝に残っているのがどうも公平な大会に見えないとの指摘がありましたので,本年度はノータッチで昨年のものをそのまま使うと言うサンドバッグ役を担当します。

まぁ,単に勝ちたければうちの敗着棋譜を分析してそのまま指しても勝てるということです。

また,年越しの間のリモート操作で不手際な感じがするとのことで今年度は年明けの1月12日に開幕としました。

 

開幕前にアナウンスしなければならないところでしたが

既に予選を終えてしまいました。

電竜戦

www.youtube.com

解説の窪田先生が交通トラブルで結局どこから中継に参加されたのか分かりませんがなんとか間に合われたようで少し肝を冷やしました。

 

予選リーグ表は240戦の膨大な組み合わせを自動化して行われており詳細分析的なものは今後行わると思います。運営トラブルも昨年は少しあったものの今年はほぼ皆無です。

【予選】第2回マイナビニュース杯電竜戦ハードウェア統一戦 勝敗表

(少しは分析してからブログにしようと思ったのでなお遅れてしまいました)

 

雑感として全勝も全敗も居ない接戦と言うのは昨年と変わりません。一部Daigorillaが一勝しかできていない事象がありますが何らかの設定ミスかもしれません。しかしながら,後手番の水匠に大きな逆転勝ちをしているなど必ずしも強い弱いと一元的に扱えないという事実を示してくれました。総当たりリーグの主催者としては非常に面白い結果と言えます。

 

で,2月4日の本日に決勝トーナメントの初戦があります。

 

 

 

 

 

 

 

 

CoreMLの実験(dGPU無い勢)

今年はNPUが半導体界隈でのキーワードでしょう。

岡山のAI勉強会でもUSB接続などのNPUを持ち込んで見せてくださる方などが居て雰囲気はありましたが、インテルAMDがCPU内包の実機を出せば話は早いですね。

 

bleu48.hatenablog.com

 

他にも以前書いた「APUでDirectML」のページへのアクセス数が急増しておりdGPU無し勢にも何やら雰囲気が出てきました。

bleu48.hatenablog.com

 

スマホ界隈の方が動きが早くてNPUはAndroidでもiOSでも標準化されています。この影響でAppleの方がARMに乗り換えてからNPU搭載でも先行した形になっていました。

将棋界隈でも既に実装された例があります。

 

select766.hatenablog.com

 

世界選手権でもiPhoneで参加されるなど色物扱いですが、棋力はもちろん実装力を見せつける形になっていると個人的に注目しています。独創賞受賞されたはずです。

 

インテルAMDの実機を触る前にすこし遊んでみようということでうちの方でも下記の例を試してみました。

onnxruntime-silicon · PyPI

GitHub - cansik/onnxruntime-silicon: ONNX Runtime prebuilt wheels for Apple Silicon (M1 / M2 / M3 / ARM64)

 

手持ちには一番安いM1 MacBookがあります。これもNPU搭載実機です。

パフォーマンス的には以前計測した感じではGTX1050TiやGTX1060と争う程度です。

ねね将棋とは違いますが,手持ちの二番絞りモデルを簡単に実装したモデルで動かしてみました。

 

探索ノード数が少ないので、floodagteで勝った一局でも相手が即詰みで負けを読み切っているに手数かかって勝つ場合や互いによく分からず頓死するなど以前のAIとは相当異なる挙動を示していて面白い。

ns_m1 vs. nshogi-tE-mL-nps8000 (2024-01-28 10:30)

AobaZero_w4361_kld_avg_3200p vs. ns_m1 (2024-01-28 11:30)

探索深さで優る相手に勝つにはこういう勝ち方になることもある。 

Suisho5_750_473stb_1000k vs. ns_m1 (2024-01-28 15:30)

 

省電力で落ちたりWiFiが切れたりでレートが安定しないながらも3700は超えてきて実用にはなりそうな感じです。

NPU搭載機はハードウェア的にもう一皮剥けたらdGPU無しでもそこそこ面白いことになるかもしれません。

 

とりあえず,次の目標はRyzen 7 8700Gの入手でしょうか。

---

 

追記(02/11):

CoreMLでのonnxruntimeの使い方をまとめて頂いたのでリンクしておきます。

これでpython-dlshogi2なども動きます。

README.md · GitHub

---

 

追記2(03/07):

上記のPyPIのonnxruntimeですが更新が止まっています。

理由は明白で本家がCoreMLにデフォルト対応したそうです。普通にonnxruntime入れるとCoreML Execution Providerが使えます。

Please release 1.17.0 · Issue #16 · cansik/onnxruntime-silicon · GitHub

猫の舌

猫の舌,フランス語でlangue de chatである。

何故か年末年始で頂き物にラングドシャを頂くことが多かった。

本来猫の舌の形,具体的には薄い小判型の中頃をややくびれさせ瓢箪型にしたものが原型で語源である。しかしながら,頂いたものは全て四角であった。

 

焼き菓子の類はフランスが優勢なのか,類似案件でマドレーヌと言うものがある。こちらは元来二枚貝の形をしたものを指すが現在でも二枚貝の形をしている。マドレーヌの語源は人名である。形が違うとフィナンシェと呼ばれることが多い。厳密な定義は卵白がなんだとか粉の比率が云々と焼き菓子もマニアックな世界である。

 

で,ラングドシャの何が良かったかと言うと全部ストレートに甘い点である。触感としてザラザラした表面に加え日本の四角いラングドシャは多くチョコレートを挟んでいる。このチョコレートも昨今の甘さ控えめなんてことは皆無でストレートに甘いものばかりであった。

お茶菓子としてウケるわけだ。

 

その後いろいろと調べてみたのだが日本のラングドシャが四角い理由が未だに分からない。舌が四角い猫が日本にいたという話も聞かない。

そういえば,広義だとビスケットやクッキーと同類といっていいのだろうか。

 

タイトルを決めて書き始めたが,肝心なオチが無い。

2024年のキーワードNPUの話

昨今IT業界の話題はAI(人工知能)である。

若干スマホ界隈の方が先行していた風な感じのあるNPUであるがPC界隈も変わりつつある。

pc.watch.impress.co.jp

pc.watch.impress.co.jp

 

以前からonnxruntimeなどオープンソース系AIではマイクロソフト社の活躍が凄いのだが,Windowsとなると若干出遅れていた感がある。理由は明白でハードウェアとして多くのデバイスに対応するため個々のハードウェアに特化した機能はOSとして押し出しにくいというのがある。

今年はNPUの規格はもちろん,実装がリリースされ普及する年になりそうだと言うのが本記事のネタである。上記リンクにもあるようにインテルAMDの両者からほぼ同時にほぼ同じ程度のパフォーマンスのNPUが搭載される。裏で政治的な協定でもあったんじゃないかと思うくらいだ。

 

さらに深くコメントすると上記両者が搭載しているのは両社ともモバイル用のCPUであるということに気づくだろう。これは何を意味しているかと言うとデスクトップ機であればNVIDIA一強と言われるようにGPUを搭載することで数十倍というパフォーマンスを手に入れることが出来る。モバイル機では一部のハイエンドゲーミングノート以外ではそこまでの性能はコスト的にも電力的にも難しい。

と言うことで,本件NPUでインテルAMDが対抗してるのはNVIDIAではないことは明白である。インテル側の資料がよりはっきりと省電力を打ち出していることが分かる。つまり,AI機能専用チップにより性能向上はもちろんだが,AI機能時の省電力を目指している。

 

似たような事例があったので紹介した方が理解が進むだろう。もう20年以上の歴史になる動画再生である。古のノートPCでは動画再生は非常に負荷が大きくバッテリー駆動では30分と持たなかった。MPEG1やMPEG2の時代である。

インテルは動画再生支援機能をCPUに盛り込むことで対応された動画であれば比較的省電力で再生することに成功した。新たな動画圧縮技術が生まれるたびにそれは更新されてきた。近頃ではAV1などであろう。

ノートPCのバッテリー駆動時間の基準が古くは動画再生時間で計測されていたのだが,これが劇的に伸びる結果となり,また動画再生がむしろ軽い処理とされるほどの時代になったため現在では他のバッテリー駆動時間計測が行われているほどである。

今ではYouTubeにはじまるネット越しの動画再生ですらバッテリー駆動で気軽に使える機能となった。

 

以上から類推するにAI機能をモバイルPCにおいて容易く扱うための下準備と考えるのが適当であろう。未来像としてNPUにより常時AIアシストさせるモバイルPCと言うのが想定される。

WindowsPCのキーボードにCopilotキーが追加されるという話も出ている。

www.itmedia.co.jp

 

ここからは余談になるが,この辺の元ネタは昨年のこれのアクセス数が年末年始で伸びていたことからヒントになっている。

APUも出たときはCPUとGPUの親和性から生まれたものであるが,これも動画再生支援機能がうまく働いた。つまり低コストで動画編集などが行えるという素晴らしいものであった。今ではAI機能に期待されており,その姿勢は私以外でも多く共通するものであったという風に見える。

ただ,現行APUでAI負荷を上げると割と熱暴走するので次世代に期待している。

bleu48.hatenablog.com

 

最後にたぶん同じ気持ちの人がいると思うけど,3D Vキャッシュ搭載のAPUをAMDに期待して終わる。実機出す技術があることは明白であり,パフォーマンス的にはAIには凄く効くはず。

もちろん,インテルがやってもいいけど。

 

---

追記1/9:

AMD側はデスクトップ用のAPUでもNPUを乗せてくるらしいので8700Gでも仕入れれば実験可能のようだ。ノートPCは電源状態や冷却安定性から考えてベンチマークを取るのには向いていない。インテルもデスクトップ用で何か出荷して欲しい。

 

www.4gamer.net