サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
猫
tadaoyamaoka.hatenablog.com
先日、dlshogiをPyTorch Lightningに対応させてマルチGPUで学習できるようにした。 これは、より大規模なモデルで将棋を学習するための布石でもある。 Transformerを使ったLLMで使われている技術を将棋に応用することを計画している。 「Deep Learning Shogi」(dlshogi)にちなんで、「Large Language Shogi」(llshogi)として開発していきたい。 ※モデルサイズは昨今のLLM並みに数兆パラメータとかにはできないので、LargeはLLMの技術を使うという意味で。 ベースラインの方針 まずベースラインとして、「Grandmaster-Level Chess Without Search」を参考にして、Transformerによる将棋の方策を実装したい。 トークン 以前に、将棋でTransformerモデル(Multi-He
dlshogiの学習は、PyTorchを使用して、モデルの訓練処理を独自に実装していた。 マルチGPUによる分散学習に対応させようと考えているが、独自に実装するより、PyTorch lightningに対応させた方が実装が楽になるため、dlshogiをPyTorch Lightningに対応させたいと考えている。 まずは、訓練の基本部分の実装を行った。 PyTorch Lightning CLI ボイラープレートをできるだけ削除するため、PyTorch Lightning CLIを使用して実装する。 PyTorch Lightning CLIを使用すると、コマンド引数のパース処理など含めて自動で行ってくれる。 起動部分の処理は以下のように記述するだけでよい。 def main(): LightningCLI(Model, DataModule) if __name__ == "__main
週末の12/2、12/3に開催された第4回世界将棋AI電竜戦に参加しました。 HEROZチームとして、「dlshogi with HEROZ」というプログラム名でエントリしました。 結果 予選を1位で通過し、決勝リーグでは、最終戦で水匠に敗れて、準優勝という結果になりました。 1位、2位は僅差で、3位以下を大きく引き離しています。 予選では、水匠に先手、後手で連勝していましたので、優勝する可能性も十分あったと思います。 予選で用意した定跡の一部を見せたことで決勝で対策されてしまったのは作戦が甘かったかもしれません。 定跡自動生成 今大会では、定跡自動生成にすべての計算リソースを投入しました。 モデルは、第33回世界コンピュータ将棋選手権と同じものを使用しました。 第33回世界コンピュータ将棋選手権の結果報告で書きましたが、角換わり基本図からの先手角換わり定跡が将棋AI同士の対局では先手必勝
以前より不完全情報のボードゲームで強化学習のアルゴリズムを試したいと思ってる。 簡単すぎるゲームやマイナーなゲームでは、開発のモチベーションが続かない気がするので、日本で人気のある麻雀AIを開発したいと考えている。 麻雀は、「Lucky J」や「Suphx 」で強化学習が試されており、人間の高段者くらいの強さになっている。 それらのAIで使われている手法を自分で実装してみて理解したいと思っている。 また、MuZeroのようなモデルベースの手法を麻雀AIで試してみたいと思っている。 Pythonライブラリ まず、Pythonで使える麻雀ライブラリを探したが、点数計算用のライブラリが見つかったが、1局通して対局できるライブラリが見つからなかったので、自分で作ることにした。 Python以外の言語向けのオープンソースのライブラリでは、対局までできるものが見つかったので、参考にして実装した。 以下
個人メモ Hugging Faceで公開されているLlama2のモデルを使用して、4bit量子化を有効にして、70Bのモデルを1GPU(A100)で推論する方法について記述する。 dockerコンテナ作成 NVIDIAのPyTorchイメージを使用してDockerコンテナを作成する。 ※ホストのドライババージョンが古いため、少し前のイメージを使用している。 コマンド例 docker run --gpus all --network host -v /work:/work -w /work -it nvcr.io/nvidia/pytorch:22.12-py3 PyTorchバージョンアップ xformersがpytorch 2.0.1を要求するためPyTorchをアンインストールしてからインストール pip uninstall torch torchvision torchtext to
拡散モデルで、将棋の方策を学習できないか試してみた。 拡散モデル 拡散モデルは、高品質で多様なサンプルを生成できる生成モデルである。 昨年8月にStable Diffusionが公開されたことで注目を集めている。 拡散モデルは、確率微分方程式によって表される確率分布を近似するモデルで、モード崩壊を起こさず多様な分布を学習できるという特徴がある。 また、プロンプトと呼ばれるテキストにより条件付けを行い、テキストに従った画像を生成できる。 将棋の方策 将棋の方策は、座標と移動方向の組み合わせで表現でき、dlshogiで採用している表現方法では2187次元になる。 つまり、指し手は、局面によって条件づけられた2187次元の確率分布からサンプリングを行っていることになる。 拡散モデルの可能性 条件付けを行い高次元の確率分布からサンプリングを行うという仕組みは、将棋の方策においても適用できると考える
LLMで思考ゲームのような推論が必要なタスクを可能にする手法に関する論文「Tree of Thoughts: Deliberate Problem Solving with Large Language Models」を読んだ際のメモ。 LLMはアイディアを出したりする創作的なタスクや、要約や翻訳のような変換のタスクは得意だが、論理的な思考が必要なタスクは比較的苦手である。 Chain-of-thought (CoT)のようなプロンプトエンジニアリングによって、数学の問題もある程度解けるようになっているが、例えば将棋のような思考ゲームをプレイするようなことはできない。 この研究では、LLMとヒューリステックな探索を組み合わせることで、Game of 24という簡単な思考ゲームを解くことができる手法を提案している。 LLMの特性として、トークンを順番生成する過程で、途中で間違いに気づいても後
ディープラーニングのモデルを推論する際、通常GPUが必要である。しかし、GPUがない場合でも、モデルのパラメータを浮動小数点から整数へと変換する手法を使うことで、CPUだけでも推論処理を高速に行うことが可能である。この手法を量子化と呼ぶ。 PyTorchの量子化 PyTorchには、量子化の方法がいくつか用意されている。 実装は「Eager Mode Quantization」と「FX Graph Mode Quantization」に分かれており、「FX Graph Mode Quantization」の方が新しい実装で、「Eager Mode Quantization」ではモデルのレイヤー融合を手動で行う必要があったところが自動化されている。 また、一般的に量子化の手法として、 ダイナミック量子化 トレーニング後の量子化 量子化認識トレーニング がある。 ダイナミック量子化は、キャリブ
今年の世界コンピュータ将棋選手権で、dlshogiチームはA100x8のサーバを9台使用してMultiPonderによるクラスタ構成を採用していた。 9台使用していても、Ponderにヒットした1台しか実際の指し手には影響せず、多くのケースではMultiPonderなしの通常のPonderと結果は変わらない。 準優勝のやねうら王チームは、vast.aiというサービスを利用して、RTX4090x9のマシンを使用していた。 RTX 4090は、A100よりも新しい世代のチップで推論性能は、dlshogiチームのA100よりも高かった。 参考:第33回世界コンピュータ将棋選手権準優勝記 | やねうら王 公式サイト カタログスペックで比較すると、RTX 4090の方がスペックが上であることがわかる。 CUDAコア数 Tensorコア世代 Tensorコア数 RTX 4090 16384 第4世代
5/3~5/5に開催された第33回世界コンピュータ将棋選手権に参加しました。 HEROZチームとして、「dlshogi with HEROZ」というプログラム名でエントリしました。 大会の概要 世界コンピュータ将棋選手権は、1990年より毎年開催されている歴史のあるコンピュータ将棋の大会です。 今回は33回目の開催で、46チームが参加しました。 第1予選、第2予選を通過した上位8チームで総当たりのリーグ戦で決勝戦が行われました。 大会の結果 決勝リーグでは最終戦で上位3チームが1敗で並び優勝を争う展開になりました。 dlshogiは最終戦で勝って、同じく最終戦で勝ったやねうら王とはSBの差で、優勝(二連覇)という結果になりました。 優勝につながったポイント 今大会では、二次予選の結果で、上位ほど強い相手に先手番であたることができるというルールでしたので、二次予選を1位で通過したことが有利に
前回の記事で、WhisperのモデルをONNXにして文字起こしができるようになったので、Windowsでスタンドアロンで実行できるアプリを作成した。 C#でWPFを使用して開発したので、実行できるのはWindowsのみである。 GitHubのReleaseからダウンロードできるようにした。 GitHub - TadaoYamaoka/RealtimeTranscribe: real-time transcription application 実行環境 .NET 6の.NET デスクトップ ランタイムが必要である。 実行方法 ReleaseからダウンロードしたRealtimeTranscribe.zipを解凍して、「RealtimeTranscribe.exe」をダブルクリックすると起動できる。 ラジオボタンで、「マイク」を選択すると音声をマイクから入力し、「ループバック」を選択するとPC
WhisperのモデルをONNXに変換する方法について記述する。 Whisperのモデル WhisperのモデルはPyTorchを使ってPythonで実装されている。 そのため、実行にはPyTorchをインストールしたPython環境が必要になる。 環境構築なしでスタンドアロンで利用できると用途が広がる。 また、アプリへの組み込みも行いやすくなる。 ONNXモデル ONNXは、ニューラルネットワークの標準ファイルフォーマットである。 モデルをONNXにすると、ONNX Runtimeなどの推論用のライブラリを使って推論できる。 推論用のライブラリは、組み込みで使うことを意図しているので、スタンドアロンのアプリに組み込むことができる。 ONNXへの変換 WhisperのモデルからONNXへの変換は、pytorch.onnxを使って行う。 ただし、Whisperは、デコーダのループ処理で、前の
dlshogiのモデルに盤面を入力すると、その盤面の評価値(勝率)を出力できる。 その際、どの駒が評価値に寄与しているか可視化できると、AIがどこに注目しているのかがわかる。 以前に、Attention Branch Networkを使って可視化を試したが、今回は、駒を除くという単純な方法で、可視化を試してみた。 提案手法 dlshogiは、盤面(駒の配置と持ち駒)をモデルに入力して、指し手の確率(方策)と評価値(勝率)を出力している。 現在の盤面を入力して推論した結果と、盤面の盤上の駒を一つ除いて推論した結果の差を見ることで、除いた駒の相対的な価値がわかる。 持ち駒の場合は、一つだけ除くと、複数枚ある場合に価値が変わらない場合があるため、同じ種類の持っている駒をすべて除くようにする。 これをすべての駒に対して行い、それぞれの盤面を推論することで、各駒の相対的な価値を求めることができる。
PCで再生中の音声をリアルタイムで文字起こしできると、字幕機能がない動画の再生や、外国とのオンライン会議で便利である。 先日、OpenAIが公開したWhisperは、音声ファイルから文字起こしするするツールが提供されているが、リアルタイムで処理するツールは提供されていない。 そこで、Pythonスクリプトで、リアルタイムで文字起こしするツールを作成した。 ループバック録音 SoundCardを使うと、PCで再生されている音声を録音することができる。 pip install SoundCardでインストールする。 import soundcard as sc with sc.get_microphone(id=str(sc.default_speaker().name), include_loopback=True).recorder(samplerate=SAMPLE_RATE, chan
AUTOMATIC1111版Stable Diffusion web UIは、起動時にCLIPの学習済みモデルを取得するために、HuggingFaceにアクセスを行う。 初回は、実際に学習済みモデルのダウンロードが必要だが、2回目以降はキャッシュされるために、ローカルストレージのキャッシュが使用される。 しかし、2回目以降にキャッシュを使用する場合でも、HTTP ヘッダーからETagを取得するためHuggingFaceにアクセスを行う。 HuggingFaceは時間帯によってはアクセスに数秒かかる場合があるため、それにより起動が遅くなる。 オフラインモード 環境変数「TRANSFORMERS_OFFLINE」に0より大きい値を設定することで、オフラインモードにすることができる。 オフラインモードでは、HTTP ヘッダーの取得を行わず、ローカルストレージのキャッシュフォルダからファイルを検索
先日、OpenAIが公開したオープンソースの音声認識ソフトウェアのWhisperを使って、会議議事録を自動作成する方法について記載する。 昨今、オンライン会議が主流になっているため、会議を録画/録音することが容易になっている。 Windows 10/11には、Xbox Game Barという機能が標準で備わっており、ZoomやGoogle Meets、Teamsなどでの会議が録画が可能である。 ループバック録音も可能で、再生している音声と、マイクからの音声をミックスして録音できる。 Xbox Game Barで録画した音声と、Whisperを組み合わせることで、無料で手軽に会議議事録を自動作成できる。 以下、手順について記載する。 事前準備 Xbox Game Barの設定 Windowsキー+Gで、Xbox Game Barを起動する。 歯車アイコンをクリックして、設定ウィンドウを開く。
Stable Diffusionの追加画像によるスタイル学習の方法として、「Textual Inversion」という方法がある。 これは、3~5枚の画像を用いて、スタイルを表す新規の単語の埋め込みベクトルを学習する方法である。 既存のパラメータは一切更新しないで、既存モデルに新規の単語を追加することで、その単語が追加画像のスタイルを表すように学習される。 使用する画像は、配色やスタイルが統一されている必要がある。 ここでは、いらすとやの画像を使って、Textual Inversionを試してみた。 手順は、↓こちらのページの解説を参考にした。 note.com 追加画像 どこまで配色やスタイルが統一されている必要があるのか知りたかったため、いくつかのパターンを試した。 男の子 服の色が同じ、男の子の画像3枚を使用する。 女の子 服の色が同じ、女の子の画像3枚を使用する。 男の子と女の子
前回、Stable Diffusionをdanbooruデータセットを使用して追加学習することを試した。 今回は、自分でデータセットを作成して追加学習することを試す。 データセットには、画像とキャプションが揃っている必要があり、キャプションがない場合はCLIPで疑似ラベルを生成するなどする必要がある。 今回は、画像に対するキャプションがある「いらすとや」をスクレイピングして、データセットを作成した。 データセット作成 「いらすとや」から全ての画像とキャプションを取得した。 画像に複数バリエーションがある場合は、1つ目の画像のみを使用した。 キャプションは、日本語になっているため、Googleスレッドシートで、「=GOOGLETRANSLATE(XX,"ja","en")」を使って英語に変換を行った。 合計で、22891枚の画像とキャプションのセットが用意できた。 画像サイズ変換 画像は、5
Stable Diffusionに独自データセットで追加学習できるようになるために、まずは既存のデータセットを使用した学習方法を試した。 追加学習の方法には、画像3~5枚を用いてスタイルを学習させるTextual Inversionという方法があるが、ここでは追加学習にデータセットを用いて画像をテキスト条件付きで追加学習する方法を試す。 GitHubのStable Diffusionには追加学習の方法についてドキュメントが用意されていないため、Waifu Diffusionの方法を参考にした。 Waifu Diffusionは、Stable Diffusionをdanbooruデータセットでファイチューニングしたものである。 Waifu Diffusionがどのように追加学習を行ったか手順は書かれていないが、ファインチューニング用のconfigファイルが用意されているため、それを使って、ト
昨日導入方法を書いたstable-diffusion-webuiにGFPGANとRealESRGANを導入する。 GFPGANは、顔を改善するモデルで、RealESRGANは解像度2倍にするモデルである。 それぞれ適用した場合の比較画像は、公式のページにサンプルがある。 GitHub - hlky/stable-diffusion-webui: Stable Diffusion web UI ライブラリインストール GFPGANとRealESRGANに必要になるライブラリをインストールする。 バージョン不整合を防ぐために、以前のpipでインストールしたライブラリも再度同時にインストールする。 pip install diffusers transformers scipy ftfy invisible-watermark gradio pynvml omegaconf pytorch_li
昨日の記事で書いた通り、「将棋倶楽部24万局集」のデータベースを読めるようになったので、棋譜の統計情報を調べた。 期間 1999年5月から2002年2月のデータが格納されている。 ほとんどは、2001年9月以降のデータである。 count 240000 unique 159 top 2001-12-02 00:00:00 freq 4234 first 1999-05-25 00:00:00 last 2002-02-27 00:00:00 Name: date, dtype: object レーティングの分布 ヒストグラム 全体的に幅広いレーティングのデータが格納されている。 しかし、特定のレーティング帯の数が多くなっているため、無作為に抽出されているわけではなさそうである。 書籍の説明によると「好局24万局を選んで収録した」とあるので、このデータで分析した統計が実際の人間の対局の統計を
第32回世界コンピュータ将棋選手権決勝の優勝決定戦について、dlshogi側の評価値は以下のようになっていました。 112手目まではほぼ互角と判断していました。 114手目くらいから徐々に先手優勢になって、逆転となった166手目の手前では、評価値-720でした。 逆転となった166手目 166手目△4九角打で、少し評価値が良くなりましたがまだ先手有利の評価値で、▲6三とでほぼ互角の評価になりました。 これはMCTSでは、探索結果の終端ノードの評価値(勝率)を平均化しているため、勝ちの手順を見つけていても、他の手順も調べているとすぐには評価値に反映されないことが関係しています。 ▲6三と以外だったら 166手目のdlshogiの読み筋は▲9七玉となっていましたが、▲9七玉と進んだ局面では、△7五銀が必至になっていましたので勝ちは揺るがなかったようです。 第32回世界コンピュータ将棋選手権の優
5/3~5/5に開催された第32回世界コンピュータ将棋選手権に参加しました。 HEROZチームとして、「dlshogi with HEROZ」というプログラム名でエントリしました。 大会の概要 世界コンピュータ将棋選手権は、1990年より毎年開催されている歴史のあるコンピュータ将棋の大会です。 今回は32回目の開催で、51チームが参加しました。 第1予選、第2予選を通過した上位8チームで総当たりのリーグ戦で決勝戦が行われました。 大会の結果 決勝では1回も負けることはなく、優勝という結果になりました。 第32回世界コンピュータ将棋選手権 決勝 ソフトの強さは毎年強くなっており、上位ソフトの強さは拮抗しており決勝に残るだけでも難しい状況でした。 優勝の可能性はあると考えていましたが、決勝に残るチームでの勝率の差は10%程度だと考えていたので、1回勝負では運で決まる要素も大きいと思っていました
たややんさんが実施していた棋譜から棋力を推定する方法をdlshogiを使って検証してみた。 棋譜から棋力を推定する手法を検証しており、水匠の評価値をシグモイド関数で疑似的な勝率に変換した上で平均損失を計測する+計測する局面の勝率の閾値を設定するという手法で、24レーティングとの高い相関(相関係数-0.9536)を得られるようになりました。(続く) pic.twitter.com/wTu8pH6Ak7— たややん@水匠(将棋AI) (@tayayan_ts) 2021年9月17日 使用する棋譜 将棋倶楽部24の名人戦対局の2452棋譜を使用した。 対局者間のレーティングの分布は以下の通り。 対局者のレーティングのヒストグラムは以下の通り。 dlshogiの設定 棋譜の各局面について、バッチサイズ1で512プレイアウトで探索を行い評価値と最善手を取得する。 勝率の平均損失 まずは、各棋譜ごとに
作成している将棋アプリに定跡検索と戦型予想を実装した。 定跡ボタン(ノートのアイコン)を押すと、現在の局面の定跡の候補手と、各手を指した後にどの戦型になるかの確率を表示する。 候補手は、出現率と勝率も合わせて表示する。 定跡の元データ 定跡の元データには、floodateの2018年以降のR3500以上のソフト間の棋譜を使用した。 ある程度レーティングの高いソフトの指し手を登録した方がよいのでレーティングでフィルタを行ったが、R3300は技巧2の棋譜が多いためそれよりも少し大きいR3500とした。 なお、floodgateのレーティングの分布は以下のようになっている。 戦型予想 floodgateの棋譜から、定跡の各手を指した後に、どの戦型になったかの統計情報を取得して、それを確率として表示する。 戦型の分類には、Mizarさんが公開されているjsonの定義ファイルを使用させてもらった。
先月、このブログでお知らせしていた書籍「強い将棋ソフトの創りかた」が12/20に発売されました。 book.mynavi.jp 応援Tweetしてもらいました。 来週発売になる『強い将棋ソフトの創り方』のレビュー記事をブログに書きました。 Pythonで1000行程度書くだけで昨年の電竜戦の優勝ソフトと同じぐらいの強さになるの、すごすぎひん?😵https://t.co/7YZllWNTjf— やねうら王 (@yaneuraou) 2021年12月13日 山岡さんのDL将棋本2、何が凄いかって、1手5000poで対局させた教師データがついてくるんですよ。RTX3090で1年、AWSだと120万円かかるぐらいの。 これだけでも十分凄いのに、おまけに、これ本を買わなくともダウンロードでkうわわわわぁぁぁぁ(何者かに拉致される)https://t.co/9qtISyYYCt— やねうら王 (@y
学習用のPCをWindows11にアップグレードしたので、CUDA on WSLを試してみた。 ドライバインストール CUDA on WSLに対応したドライバをインストールする。 GPU in Windows Subsystem for Linux (WSL) | NVIDIA Developer ※2021/11/1 追記 CUDA 11.4に付属するドライバでも大丈夫だった。 このドライバを使うとWindows上で、以前のCUDA+TensorRTでビルドしたdlshogiのNPS性能が低下した。 WSL2インストール 公式のドキュメントの通り、管理者モードでPowerShellを起動して、 wsl --installでインストールする。 Ubuntuも合わせてインストールされる。 GPUが使用できることを確認 Windows11でWSL2をインストールすると、デフォルトでCUDAが使
dlshogiは、開始局面から170点という比較的大きな評価値を出力する。 これは適切でないため、今回調整を行うことにした。 勝率から評価値への変換 dlshogiの内部では、局面の価値は、評価値を使わず勝率で扱っているが、GUIソフトには評価値として返す必要があるため、勝率から評価値にシグモイドの逆関数で変換を行っている。 ここで、は勝率である。 係数aは、Aperyややねうら王では、Ponanza定数と呼ばれるa=600が使われている。 ただし、Aperyややねうら王でこの定数を使うのは、学習時だけである。 探索時は評価値そのものを使用している。 dlshogiの係数a dlshogiでは、以下の2か所で係数aを使用している。 教師ありで棋譜を学習する際に、棋譜に記録された評価値から、勝率に変換する場合 探索時に、GUIソフトに評価値を表示するため、勝率から評価値に変換する場合 かなり
接待水匠にインスパイアされて接待dlshogiを作ってみた。 何番煎じだというネタですが、接待将棋プログラムが一応動くようになりました!https://t.co/BLvfTF2rOe MultiPVで思考し、手番から見た評価値が100以上の指し手のうち、最も100に近いものを選択する単純な仕組み。 皆様とも指したいですね…誰か犠牲者、もとい対局相手になっていただけませんか!— たややん@水匠(将棋AI) (@tayayan_ts) 2021年10月2日 仕組み MultiPVを使うのではなく、モンテカルロ木探索(PUCT)で、勝率の期待値が接待係数に近づくように探索を行う。 接待係数(USIオプションSettai)は、1から99の整数で、50の場合に互角になるように指して、0に近いと負けるように指す。100に近いと最善手に近づく。 利点 MultiPVは探索した中で上位の手から選ぶが、この
次のページ
このページを最初にブックマークしてみませんか?
『TadaoYamaokaの開発日記』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く