PyCon JPとは
PyCon JP は、日本国内外のPythonユーザーが一堂に会し、互いに交流を深め、知識を分け合い、新たな可能性を見つけられる場所として毎年開催される国際カンファレンスです。「PyCon JP 2021」 は2021年10月15日〜16日と2日間のカンファレンスとして開催されました。
昨年の「PyCon JP 2020」は新型コロナウイルス感染症(COVID-19)の影響でオンライン開催のみでしたが、「 PyCon JP 2021」では感染状況を考慮して、初日(10月15日)はオンサイト会場(ベルサール神田)とオンラインのハイブリッド、2日目(10月16日)はオンラインのみでの開催となりました。
初日のハイブリッド開催は初の試みでしたが、オンサイト会場には30名近くの参加者が来場し久しぶりにリアルカンファレンスならではの熱気を感じていただきました。また、両日ともにオンライン会場に多数の参加者の方が訪れてくださり、大盛況のうちにPyCon JP 2021は幕を閉じました。
1回めの今回は、15日に行われたカンファレンスの中から注目セッションと感想について運営スタッフがレポートします。
オンサイト会場の模様
基調講演「将棋とPythonの素敵な出会い」―谷合廣紀氏
(吉田健太)
1日目のキーノートセッションには谷合廣紀氏が登壇しました。谷合氏はプロの棋士であると同時にPythonistaであり、『Pythonで理解する統計解析の基礎』 という書籍も執筆されています。
基調講演の模様
発表ではまず「棋士とAIの関係」について語られました。「 チェスは人工知能のショウジョウバエ」と言われており、日本では将棋を題材に進化しています。近年では電王戦のように、棋士とAIが戦うといったイベントも開かれました。結果、AIが事実上プロ棋士に勝利し、今後棋士としての仕事はあるのかという心配もありましたが、現在ではライブ放送で棋譜を予想し勝率をリアルタイムに計測するなど、AIの評価を参考にして棋士の研究パートナーとして共存しています。
谷合氏は将棋AIとして大きく2つに分かれていると説明します。
αβ法系
これまでの主流でCPUを活用し読みの速度が高速
探索局面を大量に生やすことで評価精度を上げている
DL系
ここ数年で発展が目覚ましく、GPUを活用する関係でマシンパワーが必要
方策ネットワークを使用しゲーム木を探索していく
このうちαβ法はC++などで高速化しているのに対して、DL系はモデル部分はCNNを用いているためPythonで書くことができます。DL系では盤面全体を9×9×Cとしており、王、金、銀など周囲1マスしか移動できない駒の場合は良いが、飛、角、香等の“ 飛び駒” と呼ばれる2マス以上移動できる駒の場合は3×3Convの範囲外になってしまい全体としての特徴を掴みづらいという弱点が存在します。これに対して谷合氏は、Transformerを用いれば特徴量を単層として捉えるのでは?という疑問を持っていました。
先駆者は少なかったため自分で作ってみようということで、谷合氏はBERT-MCTS というBERTとMCTSを組み合わせたAIを新たに作成されました。実際に将棋に造詣があるYouTuberと対戦した動画も公開されています。BERT(Bidirectional Encoder Representations from Transformers)はGoogleが開発した自然言語処理モデルです。探索部分は盤面を文字列として変換し、チェスや将棋などで用いられることが多いMCTS(Monte Carlo tree search)を使用しています。
BERTに代表される自然言語処理モデルは事前学習が大事だと一般的に言われており、BERTではMaskedLanguageModelという大規模事前学習を可能にする手法が使用されています。教師データなしで事前学習が可能ということを期待し、実際にBERT-MCTSにも取り入れたものの、現在将棋AIの世界では強い棋士の棋譜や強いAIの棋譜など良質な教師データがたくさんあります。今回はこの事前学習はそこまでメリットを感じないと説明しつつ、教師データが少ない場合では有用であるとも述べていました。
YouTubeで使用したBERT-MCTSは2、3日で作成できたと言い、短時間で作成できた要因として、書き慣れたPythonであること、Pythonには機械学習に対応したライブラリが豊富であることを挙げています。
他にも、将棋にAttention層を使うことで盤面において上級者がどこに注力しているかの可視化を行ったり、棋譜から特徴量を抽出して可視化した際に「棋風」というものが存在した話など、ここでは書ききれないコアな話をエンジニア・棋士の両側面からお話しいただきました。
棋譜から特徴量を抽出して可視化したグラフ
最後にまとめとして「棋士×エンジニア」という自身の経験から、将棋界とITを知っているからこそ解決できる問題が認識でき、それを自分で作れるということが一番の強みとし、今後は今回のようなPyCon JPでの発表をはじめ、「 棋士×何か」という将棋界以外のものが増えてくるのではないかと予想しました。
そして将棋とITの今後に関しては、将棋自体はAIが超えてはいるものの、まだまだ手動で行う作業も多く、さまざまな改善の余地があることや、DL系の台頭によりそれまでC++でしか書けなかった将棋AIがPythonで書けるようになったことで敷居が下がり、他の機械学習モデルをPythonで勉強していたエンジニアも参入しやすくなったとまとめています。
より詳細な使用ライブラリや棋風とは何か気になった方はこちらから動画アーカイブや発表資料 をご覧ください。
セッション「Python x DDD!! - Python で学ぶ実践的なドメイン駆動設計とレイヤード・アーキテクチャ」―池内孝啓氏
(高倉佑輔)
池内氏は、株式会社HakaliのCTOを務め、メンタルウェルネスアプリ・Awarefyの事業・開発における責任者として活動しているエンジニアで、PythonのほかにDart(Flutter)やGo、TypeScriptを使いこなしています。
このセッションでは、FastAPIを使ったPythonにおけるドメイン駆動設計とレイヤード・アーキテクチャ、とりわけオニオン・アーキテクチャの実践に焦点を当てて紹介しています。ドメイン駆動設計とは、事業やサービスが取り扱う世界の知識をコードに落とし込む開発手法です。ドメイン駆動設計に取り組む意義は、チームが共通言語を獲得し、ドメインが解決しようとしている現実の課題に関心事を向けることにあると池内氏は述べています。
オニオン・アーキテクチャは以下のレイヤーからなり、レイヤーには内側・外側があります(池内氏のスライドの20ページ目も合わせてご覧ください) 。
一番内側のレイヤー:ドメイン層
その外側のレイヤー:ユースケース層
さらに外側のレイヤー
UI層
テスト層
インフラ層(ドメインオブジェクトの永続化を担当)
重要なことは、一番内側のドメイン層は、外側にあるユースケース層やさらに外側の各層に依存しないように設計することです。
Pythonはダックタイピングができる言語なのですが、インターフェースを定義することにより他の言語のコードとアーキテクチャをそろえることができます。これには型を明示して型ヒントやIDE、静的解析ツールなどのプログラミングツールの支援を受けやすくできるというメリットがあるわけです。さらにはオニオン・アーキテクチャにおいてはレイヤーの依存方向を整理し疎結合を維持することが求められますが、インターフェースを効果的に使うことによってモック化しやすく、実装を差し替えやすくなるというメリットもあります。この、モック化のメリットはテストをしやすくするというメリットも付いてきます。
その上で、インフラ層にはリポジトリパターンを採用し、ドメインオブジェクトの永続化処理をインターフェースと実装に分けています。リポジトリパターンを用いることは冗長であるという批判や、RDBMSなどの変更がめったにないため抽象化するメリットがないという批判もありますが、これにはレイヤーの責務を明確にし、ドメインオブジェクトの隔離とテスタビリティの向上を目的とすることによって結果的にRDBMSの変更にも強くなるということを説いています。
この発想の源には、他の言語も開発に用いているという池内氏の経験が活きていると思います。池内氏はDartやGo、TypeScriptも開発に使っていて、インターフェースの仕様に関してはDartのような、インターフェースと実装の関連性を明示する仕様が一番好きと述べています。なお、Pythonでもabcモジュールを使うことによりインターフェースを書きやすくできるそうです。
業務でPythonを書いたことがない筆者(高倉)がAdvancedレベルのトークについて行けるのかと最初身構えてしまいましたが、実際にトークを聞いてみると設計が重要であるということ、特に現実の課題に関心を向けた明快な設計がコードを、そしてアプリケーションを理解しやすくするということを改めて考えさせられるよいトークでした。実際に池内氏が今回の講演のために用意したサンプルコード をご覧いただければ、理解はいっそう深まると思われます。
動画アーカイブや発表資料はこちら からご覧ください。
ライトニングトーク
PyCon JP 2021ではクロージングの前にライトニングトークを行いました。以下の発表があり、オンサイト会場・オンライン共にかなり盛り上がりました。
オンサイト会場
assertの独自ライブラリを作ったという話
Python 3.10の新機能の話
オンライン
CAEをPythonで行った話
初学者向けDjango教材を作成したという話
次回は
カンファレンス1日目のレポートは以上です。今回紹介できなかったセッションも多数あるのですが、それらは下記のリンクから見ることができます。みなさまの気になるセッションやトークは見つかりましたか?
カンファレンス2日目のレポートも楽しみにしていてください!