この記事は Safie Engineers' Blog! Advent Calendar 2023 の3日目の記事です!
はじめに
セーフィー株式会社 で画像認識AIの開発エンジニアをしている水野です。2023年10月1日付で現職にジョインしたのですが、本業で語れるネタがまだ無いので趣味でたまに参加している Kaggle と流行りの生成AIを絡めた記事を投稿します。KaggleについてはKaggle Competitions Masterのランクを保持していますので、コンペに関する知見も織り交ぜながらお話しできればと思います。
早速ですが、このような悩みをお持ちの方はいないでしょうか?
- Kaggleに登録し、定番のタイタニックコンペを終えて、次は画像系コンペに参加してみたいが、どのように進めたらいいのか分からない
- 公開Notebookをベースラインとして作業をしているが、コードの意味が理解できない
- 自分でベースラインNotebookを作りたいが、作り方が分からない
ご安心ください!これらは全部 GitHub Copilot Chat で解決できます!以降の記事では、Kaggleの画像系コンペにおけるGitHub Copilot Chatの具体的な活用方法について説明します。
ただし今回試行錯誤する中でGitHub Copilot Chatの性能を引き出すコツ、制約事項、イマイチな点も見えてきました。現状は完全に人間を代替するものではなく、あくまでコーディング作業を補助してくれるツールであることを忘れず、上手く活用していきましょう。
背景
各論に入る前に、そもそもなぜ表題のテーマで記事を書こうと思ったのか軽く説明させてください。
なぜ画像系コンペがターゲットなのか?
まず単純に私自身が画像処理・認識技術が大好きであり、もっとたくさんの方にその面白さを知ってほしいという思いがあります。Kaggleの画像系コンペでは多種多様なデータに触れられる機会があり面白いわけですが、他のデータ形式のコンペと比較して画像系コンペの参加者数は少ない傾向にあります。これにはいくつかの要因が考えられますが、1つに画像系コンペの取り組み方に関する情報が少ないことが挙げられると思います。
このような課題意識を背景として、前職在籍時に Kaggleスコアアップセミナー~画像系コンペ入門 というセミナーを企画し、画像系コンペ入門者向けに基本的な取り組み方について説明しました。このセミナーによって画像系コンペに対する一定のハードルは下げられたと信じていますが、近頃話題の生成AIを上手く活用出来ればさらにハードルを下げられる(または高く跳べるようになる)のでは?と思っています。
GitHub Copilot Chat
生成AIと言えば世の中一般的にはChatGPTの方がホットかもしれませんが、ソフトウェア開発に関わるエンジニアにとってはGitHub Copilotの方が日々手元で使う開発環境とシームレスに連携が出来るため恩恵が大きいのではないかと感じています。また2023年2月にビジネス版が公開されて以来、導入する企業数も増えており、お世話になっている方も多いのではないかと推察します。
そんな中ビジネス版ユーザには2023年7月に、個人版ユーザには同9月にGitHub Copilot Chatのbeta版が解禁されました。GitHub Copilot Chatは対話型のコーディング支援ツールで、GitHubのレポートでは検証に参加した開発者の88%が、GitHub Copilot Chatを使うことで集中力が増し、イライラが減り、コーディングがさらに楽しくなったため、フロー状態が維持されたと報告しています。これはまだChatの存在しなかった2022年の調査の結果(60~75%)よりも高い数値となっていて、Chatインタフェースの有用性を示しているのかもしれません。
GitHub Copilot Chatについて使ってみたという記事や基本的な機能の解説記事は見つかるものの、より実践的な内容の記事はそこまで多くない印象でした。そこで今回はKaggleで活用できるのかどうかを調べてみようと思い立ちました。
本記事は執筆時点(2023年11月末)のbeta版ツールをベースにしています。この記事を読まれる時期によってはここで説明した方法が通用しなくなったり、出力結果が全く異なるものになる可能性があります。適宜公式の最新情報をご確認ください。
基本編
GitHub Copilot Chatのセットアップ
- GitHub Copilot Chatを使用するためにはGitHubのアカウントとGitHub Copilotのライセンス (ビジネス版 or 個人版)が必要です
- 本記事では個人版アカウントで検証しています
- VS Codeまたは対応開発環境(JetBrains IDEsやVisual Studio)をインストールしGitHub Copilotをセットアップ
- VS Codeでのセットアップ方法はこちら: Use GitHub Copilot to enhance your coding with AI
- 本記事ではWindows WSL環境上で立ち上げたVS Codeを前提として説明します
GitHub Copilot Chatの使い方
- VS Code内で以下いずれかの方法でChat UIを呼び出します
-
Ctrl+Alt+I
(MacはCmd+Ctrl+I
): Primary side barのChat viewが開きます -
Ctrl+I
(MacはCmd+I
): 任意のファイル内でInline chatを開きます -
Ctrl+Shift+I
(MacはCmd+Shift+I
): Quick chatを開きます
-
- テキストボックスにプロンプトを入力しSubmit (
Enter
キーまたは紙ヒコーキのボタンを押下) すると、回答が得られます- GitHub Copilot Chatにはプログラミング関連であれば何でも質問することができます
- 一般的な質問を投げた場合には
Sorry, but I can only assist with programming related questions.
とあしらわれてしまいます
- Chat view内で
Shift+Enter
を入力することでプロンプトを複数行にわたって入力することができます - スラッシュコマンドを使用することで様々な機能を呼び出すことができます
スラッシュコマンド
今回の記事で利用するコマンドは以下の通りです。その他のコマンドについての説明は Use GitHub Copilot to enhance your coding with AIをご参照ください。
-
@workspace /explain
: Explain step-by-step how the selected code works. -
@workspace /fix
: Propose a fix for the bugs in the selected code. -
@workspace /newNotebook
: Create a new Jupyter Notebook based on your description.
実践編
ここからは冒頭で挙げた3つの課題に対して、それぞれ具体的な事例を交えながらGitHub Copilot Chatが具体的にどのように利用できるのか説明します。
サマリ
実践編はそれなりにボリュームのある説明になっているので、まず最初に全体像のサマリをお伝えしておきます。時間の無い方はここを読むだけでも要点が掴めるかと思います。
課題 | 解決策 | やり方 |
---|---|---|
画像系コンペの進め方が分からない | コンペに関する質問をする | ・Chat viewを開き、聞きたい内容を質問する ・さらに深堀したい内容があれば追加で質問する |
コードの意味が理解できない | 既存コードの内容を説明してもらう | ・説明して欲しいコードを選択状態にし、Inline chatを開きexplain コマンドを実行する・好みに合わせて説明を生成する方法を指示する(日本語で説明してもらう、五歳児にも分かるようにしてもらう、etc.) |
ベースラインNotebookの作り方が分からない | 要件を伝えてNotebookを生成してもらう | ・Chat viewを開き、作りたい処理の内容を記載し、newNotebook コマンドを実行する・エラーが出る場合はChat viewにエラー内容を貼り付けて修正方法を提案してもらう ・生成されたコードを改善する場合は、該当コードを選択してInline chatを開き fix コマンドを実行する・新しい処理を追加する場合は新規コードセルでInline chatを開き、要件を伝えて生成してもらう |
1. コンペに関する質問をする
GitHub Copilot Chatにはプログラミング関連であれば何でも質問することができます。
以下ではいくつかの例を紹介します。
コンペの進め方を聞いてみる
定番のMNISTコンペに関して質問してみました。
さすがによく使われるデータなだけあって具体的な手順についても上手く回答できているようです。
続いて定番ではないタスクとして私も参加したDFLコンペに関しても聞いてみました。単純に質問すると回答を拒否されるようです。
そこでMNISTのコンペに関する質問を1回してから、同じ質問をしてみました。そうすると回答を得られました。しかしこのコンペはサッカーの試合動画からある特定のアクションが発生したタイミングを検知するというコンペなのですが、出力された手順を見るからにテーブルデータコンペと勘違いしているようです。
具体的なコンテキストを与えるようにプロンプトを修正して、再度質問しました。
今度は的を射た回答を返しているようです。
手順をさらに具体化する
前項の質問でコンペに取り組む際のおおまかな手順は分かりましたが、まだ手を動かせるレベルにはなっていないと思います。各項目を具体的にどのように進めればよいのか追加で確認してみます。
以下はデータの理解について聞いてみた例ですが、一般的にどのような考え方で行われるのかの説明とサンプルコードが示されました。他の手順についても1ステップずつ確認していけば、一通りの手順を具体化できると思います。
コンペのデータセットをダウンロードする方法を聞いてみる
次に以前のセミナーで題材にした Plant Pathology 2021 - FGVC8 について、データのダウンロード方法を質問しました。Kaggleプラットフォーム上と同じ配置になるように /kaggle/input
以下にデータを配置するという情報を伝えています1。
Kaggleのアカウント作成に始まり、コンペへの参加、Kaggle APIを利用するための設定、Kaggle APIを用いたデータセットのダウンロード方法2まで事細かに教えてもらえました。強いて言えば最後のunzipコマンドがフラットに解凍してしまうのがイマイチで、コンペ名を指定して解凍するコマンド(unzip /kaggle/input/plant-pathology-2021-fgvc8.zip -d /kaggle/input/plant-pathology-2021-fgvc8
)になっていれば完璧でした。
公開Notebookを動かす方法を聞いてみる
プログラミング関係の質問と言えるのか微妙な質問もしてみました。公開Notebookの動かし方についてですが、回答を拒否されることなく完璧な回答が返ってきました。GitHub Copilot Chatの内部でどのようなトピック判定処理がされているのかは分からないのですが、Kaggle関係の質問であればだいたいプログラミング関係の質問と判定されるのかもしれません。
長さ制限で上手く回答が生成されないケースへの対処法
いくつか質問を試す中で Sorry, the response hit the length limit. Please rephrase your prompt
と表示され、回答が途中で終わってしまう状況が発生しました。
このようなケースでは以下のいずれかの方法で対応することが可能でした。
- 英語で質問してみる
- Chatの履歴を削除して再度質問する
ChatGPTでも日本語で回答が得られない場合に英語で確認するのはベストプラクティスだと思いますが、GitHub Copilot Chatにおいても英語で同じ質問をした場合は最後まで回答が得られました。詳細は不明ですが、日本語では長さ判定の制限にかかりやすくなっているのかもしれません。
Chatの履歴を削除して再度質問した場合、最後まで回答は得られましたが、私はAIプログラミングアシスタントであり、具体的な戦略を提供することはできませんが
という前置きが入るようになり、急にそっけなくなりました。また回答の質もやや悪いように感じます。Chat履歴というコンテキスト情報があるかどうかで回答の質が変わるようです。
2. 既存コードの内容を説明してもらう
Kaggleでは各コンペのフォーラム上での情報交換が活発に行われていて、EDA(探索的データ分析)やモデルの学習・推論を実行できるNotebookを公開してくれる参加者が多いです。特に初心者の内はそのような公開Notebookをベースにして改善作業をすることが多くなると思いますが、そこで問題になってくるのが 第三者が書いたコードを理解すること です。丁寧にコメントを書いてくれているNotebookも中にはありますが、全部が全部そういうわけではないですし、日本人にとっては言語の壁もあります(Kaggle上では基本的に英語でやり取りされます)。
公開Notebookの内容を日本語で説明してもらう
そこでGitHub Copilot Chatにコードの内容を日本語で説明してもらいましょう。
DFLコンペの精度評価指標を説明したNotebook Competition Metric - DFL Event Detection AP | Kaggleを開き、1つ目のコードセル全体を選択した状態でexplainコマンドを実行しました。
全体で200行もあるコードセルなので全体の概要情報のみが出力されていますが、これがパッと出てくるだけでもコードの理解のしやすさが変わってくると思います。
@workspace /explain 日本語で説明してください。
という質問の仕方では GitHub Copilot: Sorry, but I can only assist with programming related questions.
という反応が返ってきて説明が生成されませんでした。
微妙な違いではあるのですが、 @workspace /explain 日本語でコードの内容を説明してください。
等と少し具体的に指示してあげると上手くいくようでした。上手く回答が生成されない場合はあきらめずにプロンプトを修正して再度質問してみてください。
詳しく知りたい箇所を説明してもらう
さらに詳細に説明してほしい場合は、該当箇所を選択状態にしてCtrl+I
(MacはCmd+I
) でInline chatを開き、explain
コマンドを実行するという流れになります。event_detection_ap
関数にはPandasを駆使したコードがいくつかあるので詳細に説明してもらいましょう。対象のコードは以下で、評価動画中の評価対象区間を算出する処理です。
# Extract scoring intervals.
intervals = (
solution
.query("event in ['start', 'end']")
.assign(interval=lambda x: x.groupby(['video_id', 'event']).cumcount())
.pivot(index='interval', columns=['video_id', 'event'], values='time')
.stack('video_id')
.swaplevel()
.sort_index()
.loc[:, ['start', 'end']]
.apply(lambda x: pd.Interval(*x, closed='both'), axis=1)
)
実行してみると、一つ一つの関数について説明が出てきました。そもそもPandasに馴染みの無い方がこれだけで完全に理解するのは難しいかもしれませんが、さらに詳細に調べる際のとっかかりにもなるのではと思われます。
五歳児にも分かるように説明してもらう
説明をさらに噛み砕きたい場合は、説明の仕方に注文を付けることも有効です。
上で説明した評価対象区間算出コードを五歳児にも分かるように説明してもらいました。
お昼寝という五歳児にもお馴染みの概念を使いながら、頑張って回答を生成してくれています。
3. 要件を伝えてNotebookを生成してもらう
本節の内容はWindows WSL環境上にKaggle dockerコンテナを立ち上げて動作確認をしています。使用したDocker imageのバージョンは https://console.cloud.google.com/gcr/images/kaggle-gpu-images/global/python@sha256:13246793b8f76cf8eb794947760afce5104ab3e3c759659e3757f82c5f0c61de/details です。
作りたい処理の内容をChat viewに記載しnewNotebook
コマンドを実行することでNotebookを生成させることが出来ます。以下ではデータの扱いやすさの都合でMNISTコンペを例に説明しますが、他のコンペでも適用可能な方法ですので、参加したいコンペに応じてプロンプトを修正してください。
MNISTコンペのEDA Notebookを作成してもらう例
コンペに取り組む際はベースラインモデルを作成する前にデータセットに関して理解しておくことが重要です。与えられたデータセットについて、様々な観点で調査することをEDA(探索的データ分析)と言いますが、ここでは実際にEDAを実行するNotebookを作成してもらいます。
プロンプトおよび実行結果は以下の通りです。MNISTは画像識別の定番データセットなのであまり情報を与えなくても問題は無さそうですが、ここでは初見のデータセットのつもりでどのようなタスクなのかの情報を与えています。回答としてはまず生成されるNotebookのアウトラインが表示されますので、構成に問題が無いかどうか確認します。もし問題があればプロンプトを修正して再度質問します。回答の最後に表示されているCreate Notebook
をクリックすると実際にNotebookが生成され始めます。
Ctrl+Shift+U
(MacはCmd+Shift+U
) でOutputを表示し、TaskでGitHub Copilot Chatを選択すると以下のようなログが確認できます。1つのコードセルを生成する際にgpt-4モデルにリクエストを投げてコードの補間を実行しているようです。これが生成されるコードセル数分繰り返されて最終的なNotebookが完成します。
エラーの修正方法を確認する
生成されたNotebookをそのまま動かすとラベルの分布の確認のコードで1点だけエラーが出ました。
エラーが出た場合はエラーメッセージをChat viewに貼り付けて修正方法を確認できます。ちゃんとコンテキスト情報を読み取った上でコードを生成してくれているようです。
言われた通りに修正し再実行してみると問題無くグラフが表示されました。
一部コードの改善方法を提案してもらう
以下はデータセット中の画像を視覚化するコードです。エラー無く描画されていて問題無さそうですが、画像とセットになっているラベルも表示したいところです。
このようなケースでは該当ソースコード部分を選択して、Ctrl+I
(MacはCmd+I
) でInline chatを呼び出して、どのように修正したいのかを入力しSubmitすることで、修正後のコードを提案してもらえます。この際にコマンド無しで実行するか、fix
コマンドを付けて実行するかで出力結果がやや異なるようです。
- コマンド無しで実行した場合
- Unified diff viewで表示されました3
- labelの描画処理が追加されていますが、コメントは修正されていません
-
fix
コマンドを付けて実行した場合- Split diff viewで表示されていて4、部分的に修正を適用することも可能です
- labelの描画処理が追加されていて、コメントも修正されています
いずれの修正にせよ意図通りに描画されるようになりました。他のNotebookでも修正を試しましたが、現状はfix
コマンドを付けて実行した方が修正の精度が高く感じたので、特別な理由が無い限りfix
コマンドを利用するのが良さそうです。
MNISTコンペのベースラインモデルをPytorch lightningで作成してもらう例
EDAが完了したら次にベースラインモデルを作成します。今回はPytorch lightningを使用してNotebookを作成してもらいます。
生成されたNotebookには以下の問題がありましたので、動作させるためには修正が必要でした。修正はEDA Notebookを作成した時と同様にGitHub Copilot Chatとの対話的なやり取りで実施しました。
- そのまま実行するとエラーになる記述が残ってしまう
- 今回のKaggle dockerコンテナではPytorch Lightningのversion 2.0.7がインストールされていたが、出力されたコードは2.0系に対応していなかった
- Pytorch Lightning 2.0は2023年3月にリリースされたばかりなので、学習データの大半はそれ以前のものだと思われるので仕方ない感じもします
- これはプロンプトを与える際に具体的なバージョンを指定してあげれば解決するかもしれません
-
nn.Linear
の入力チャンネル数が正しくない- 生成されたのは28x28入力でmax_poolingが1回のモデルでしたので、正しくは
14*14*64
ですが7*7*64
になっていました5
上記の通り、生成されたNotebookそのままではいくつか問題が残ることが分かりましたが、今回の例では2分程度で生成が完了しており、たたき台のNotebookとしては十分と言えるのではないでしょうか。
新しい処理を追加してもらう
生成されたNotebookに機能が不足している場合は追加するよう依頼できます。ベースラインNotebookにエラー分析処理の1つとして混同行列(Confusion matrix)を計算する処理を追加してみます。Notebook上で新規Codeセルを追加して、Ctrl+I
(MacはCmd+I
) でInline chatを立ち上げ、生成して欲しい処理を指示します。すると一瞬で以下のようにコードが提案されました。Acceptを押して実行すると正常に混同行列が描画されました。
今回触ってみて分かったこと
性能を引き出すコツ
- プロンプトを可能な限り具体的にする
- たった1ワードの違いで回答の質が大きく変わる場合があります
- ChatGPTで培われたプロンプトエンジニアリングの技術は同様に有効と思われるので、それらを参考にするのも良いでしょう
- 適切なコンテキスト情報を与える
- Chat履歴や開いているファイル等のコンテキスト情報によって回答が変化しますので、得たい回答につながるコンテキスト情報を与えられているかどうか注意しましょう
制約事項
-
Sorry, the response hit the length limit. Please rephrase your prompt
が表示されて回答の生成が中断されることがある- Copilot Chatの回答が一定の長さを越える時に発生しました
- 現状は以下のいずれかの方法で対応可能と思われます
- 英語で質問する
- Chat履歴を消してから再度質問する
- 回答が短くなるように質問のスコープを限定する
-
Sorry, the response matched public code so it was blocked. Please rephrase you prompt.
が表示されて回答の生成が中断されることがある- GitHub Copilotの設定で
Suggestions matching public code
をAllow
にしていても発生することがありました - プロンプトを修正することで解決できるかもしれません
- GitHub Copilotの設定で
イマイチな点
- 同じ質問をしても回答してくれる場合と回答してくれない場合がある
- GitHub Copilot Chatは持っているコンテキスト情報によって回答の質が変わるというのは理解が出来るのですが、回答するかどうかの判定も行われてしまうようです
-
newNotebook
コマンドで生成されたコードがPythonの文法的に不完全な場合がある- コンテキスト情報が不足していることによるエラーは仕方がない面もありますが、さすがにPythonで許容されない記述をそのまま残すのは頂けないと思いました
- 最新のモデルやライブラリに対応したコードを出力してくれない
- 機械学習界隈は進化の速度が速い分野なので新しい技術にすぐに対応して欲しいところですが、新しいものほど学習データは少ないので難しいのかもしれません
- 最近話題のCursor - The AI-first Code Editor ではユーザ側で好きなデータを学習させられる仕組みがあるようですので、Copilotにも今後そのような仕組みが追加されることを期待しています
まとめ
Kaggleの画像系コンペにGitHub Copilot Chatを活用する方法について、大きく3つのトピックを説明しました。
- コンペに関する質問をする
- 本記事で述べた質問以外にも色々試してみた感じでは、プログラミング関係の質問かやや怪しい質問(例えばKaggleプラットフォーム上での操作方法等)にも答えてくれるようでしたので、Kaggleコンペに取り組む中で分からないことはだいたい何でも聞いて良さそうです
- 既存コードの内容を説明してもらう
- やや複雑な公開Notebookについて説明してもらいました。分からない部分を対話的に深堀していけるので、自分で一つ一つGoogle検索して意味を調べながら理解するよりも圧倒的に効率良く作業を進められると思います
- 要件を伝えてNotebookを生成してもらう
- シンプルなコンペについて要件を伝えてNotebookを自動生成してもらいました。現状では一発で動作するものを得られる可能性は低いですが、たたき台としては十分に使えるものですので、何から始めたらよいのか分からない入門者にとってこれほど便利なものは無いのではないかと考えています
上記の通り現状は制約事項もあり、まだまだ改良の余地ありという感じですが、ツールの特性を理解して上手く利用すれば、コーディング支援ツールとして十二分の働きをしてくれると思います。
まだ画像系コンペに参加したことがない方は、GitHub Copilot Chatの力を借りて、ぜひこの機会にチャレンジしてみてくださいね。
-
必ずしもKaggleプラットフォーム上と同じ配置にする必要はありませんが、同じにしておくと自分で作成したNotebookのみならず公開Notebookもそのまま動かせる等メリットが多いので、合わせておくと便利です。 ↩
-
基本的にKaggleとのデータのやり取りはブラウザ経由でも可能となっていまずが、Kaggle APIを使いこなすと様々な処理の自動化等便利な場面があるため、まだ使われていない方はこの機会に使えるようにしておくと良いと思います。 ↩
-
コマンド無しで他の修正を何回か試したところ、Split diff viewで表示されることもありましたので必ずしもUnified diff viewで表示されるわけではなさそうです。 ↩
-
fix
コマンド付けて他の修正を何回か試したところ、Unified diff viewで表示されることもありましたので必ずしもSplit diff viewで表示されるわけではなさそうです。 ↩ -
ResNet等のよく使われるアーキテクチャが224x224入力の時の最後のconv出力が7x7なので何かしら影響を与えているのかもしれません ↩