GitHub Copilotの使用方法：Python、PyTorchを少しだけ実装してみた動画解説記事です

本記事ではVScodeのGitHub Copilot拡張機能を使用しつつ、Python、PyTorchで実装を少しだけ試した内容を動画付きで紹介します。


**本記事の内容**

０. GitHub Copilotとは
１. GitHub CopilotでMNISTのDataLoaderを作成し、画像を描画してみる
２. 関数の作成・実行と、docstringの自動作成
３. さいごに


## ０. GitHub Copilotとは

「GiHub Copilot」とは、コーディング時にコーディング内容をAIが自動提案（自動補完機能にほぼ似ている）してくれる機能です。

先に記述したこれから実装したい内容を解説したコメント文や、現在コーディング途中の内容を入力とし、その後コーディングで入力するであろう続きの内容を補完的に提案表示してくれます。

まさコーディング時のCopilot（日本語では副操縦士）という名称が表す通りとなります。

「GiHub Copilot」は米国OpenAIが開発した「GPT-3」と呼ばれる、BERTと同じくTransformerをベースとした自然言語処理のAIモデルがベースとなっています。

この「GPT-3」モデルを利用し、マイクロソフトGitHubがGitHub上にある権利上問題ない（とされている）コードを訓練データとして使用して、コーデイングの続きを出力するように学習させたものが「GiHub Copilot」となります。
<br>

なお「GiHub Copilot」は、当初はVisual Studio Code（VS code）でのみ使用可能でしたが、現在は

・Visual Studio Code
・Visual Studio
・JetBrainsのツール（IntelliJ IDEA）
・Neovim

で使用可能です （以下サイトのgetting-startedに詳細あり）

https://github.com/github/copilot-docs#getting-started


<br>また4月1日より、Visual Studio 2022でも「GitHub Copilot」が使用できるようになりました。

https://github.blog/2022-03-29-github-copilot-now-available-for-visual-studio-2022/



<br>ただし、まだ「GitHub Copilot」はテクニカルレビュー段階でオープン版が公開されているわけではありません。

そのため、「wait list」にGitHubアカウントを登録し、順番に使用できるようになります。
以下の公式ページからwait listに登録できます。

https://copilot.github.com/

<br>どれくらいの期間待つ必要があるかは、状況しだいです。

私の場合、21年7月にwait listが公開され、21年8月頃に申し込みをして、
21年10月27日に「Welcome to GitHub Copilot Technical Preview!」というメールが届きました。

申し込んでから2-3カ月という感じでしたが、現在、どの程度待つ必要があるかは不明です。

<br>なお、GitHub Copilotへのwait listへの申し込みから実際の使用までの手続きは以下の記事が詳細であり、おすすめです。

https://0115765.com/archives/5632

<br>それでは以下より、実際にPython、PyTorchでGitHub Copilotを使用して実装している様子を動画ともに解説します。

実装する内容は、
・ライブラリ（パッケージ）のインポート
・データセットのダウンロード（MNIST）
・データローダーの作成
・データローダーから手書き数字画像の描画
・画像の描画を関数化
・関数へのコメントでの解説（docstring）の自動生成

となります<br>



## １. GitHub CopilotでMNISTのDataLoaderを作成し、画像を描画してみる
### ライブラリ（パッケージ）のインポート
まずはじめに「ライブラリ（パッケージ）のインポート」を解説します。

```pytorch```と```torchvision```をインポートしたいです。
副操縦士は不要なレベルなのですが、
コメント文に
```# import pytorch and torchvision```と記載します。

その後、importと入力すると、薄くグレー色で、続きの入力内容をGitHub Copilotが提案してくれます。
その状態で[Tab]キーを押下すると、提案されたグレー色の内容が入力されます。

以下の動画の通りですが、きちんとPytorchをimportしたいというコメント文の内容に従って、importの続きとして、```torch```を提案してくれています
（PyTorchをimportする場合は```import pytorch```ではなく、```import torch```になります）。

<br>なお、VS codeでJupyter Notebookのようにセル単位で実行できるように```# %%```と打ち込んで、セルを作成し、セル単位でPythonを実行させています
（Jupyter Notebookの.ipynb形式のファイルはGitで差分などを追いづらいので、.pyファイルで```# %%```でセルを作る方が、管理上は便利です）<br>


それではimportするだけの内容ですが、以下に実際にGitHub Copilotを使いながら実装した様子の動画を示します。動画は最初、画面を最大化したときは画質が粗いですが、少しすると綺麗になります。
<br>


<iframe width="560" height="315" src="https://www.youtube.com/embed/RYNcgMgTcE4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


## データセットのダウンロード（MNIST）
続いて、MNIST（手書き画像）のデータセットをダウンロードし、それをdataset変数にする部分を実装します。

コードが横に長くなりすぎるので、改行を入れたのですが、すると、ちょっとGitHub Copilotの応答が悪かったです。スペース入れて消したり、1文字目を入力するとスムーズでした。

**また表示している画面の幅で1行に入力できる長さが決まり、それに応じてもGitHub Copilotが提案してくる内容が変化することが分かりました。**

以下に動画で示しますが、私がはじめて触っているのを録画したので、```train_dataset```の実装は、少しもたついてしまっています。

``val_dataset```の実装はスムーズです。


<br>また今回、Jupyter Notebookのセル形式で実装しているので、これがあまりGitHub Copilotと少し相性が良くない可能性はあります。

おそらく普通の.pyのPythonファイルを実装するときはもっとスムーズな気がします。
ただ、Jupyter Notebook形式でも十分にGitHub Copilotが使用できると分かりました。


<br>最初にコメント文で、```# download the dataset of MNIST```と入力して、実装を進めます。

それではMNISTデータセットをダウンロードする内容を実装した様子の動画を示します。
（再掲）動画は最初、画面を最大化したときは画質が粗いですが、少しすると綺麗になります。
<br>

<iframe width="560" height="315" src="https://www.youtube.com/embed/M1xKOPxBtOw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


## データローダーの作成
続いて、MNIST（手書き画像）のデータセット変数を、データローダーにしてミニバッチで一括処理できるようにイタレータとなるデータローダー変数、```train_loader```と```val_loader```を実装します。

ミニバッチで使用する画像の数をいくつにするのかがハイパーパラメータとして重要なので、最初にコメント文として、
```make dataloaders with batch_size = 32```と入力してから実装しています。


きちんと、batch_sizeが32に設定したコードを提案してくれているのが嬉しいです。


<br>それではMNISTデータセットをデータローダーに実装する様子の動画を示します。
（再掲）動画は最初、画面を最大化したときは画質が粗いですが、少しすると綺麗になります。
<br>

<iframe width="560" height="315" src="https://www.youtube.com/embed/NilLi4XeA9A" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>



## データローダーから手書き数字画像の描画
次にダウンロードし、作成したデータローダーに含まれている画像を描画したいと思います。

そこで最初にコメント文として、

```# show train_loader img as a sample```

と打ち込みます。

そして、importにむけて、[i]と入力すると、GitHub Copilotが続きとして

```import matplotlib.pyplot as plt```

を推薦してくれました。Pythonでの画像描画にはmatplolibライブラリのpltパッケージが必要なので、ありがとうございます。

これはなかなかの感動でした。Copilot感、副操縦士感があります。




<br>続いて、```train_loader```のiterを取得します。

ここは少し、構文を事前に知っておき、```train_loader.__iter__()```なのか```iter(train_loader)```のどちらが良いかを判断できる必要があります。

クラス内メソッドの```__iter__()```を外から使用するよりも、それを呼び出すよう```iter(train_loader)```にする方が良いです。

以下の動画では```iter(train_loader)```を最初、提案してくれました。
そこでわざと、```.__iter()___```を使用しようと書き換えると、その流れに従って```train_loader.__iter__()```を推薦してくれました。

うーん、本当はコードレビューすると私なら「```iter(train_loader)```って書いて欲しい」とお願いするところなので、このように操縦士が最適ではない方向で実装を進めると、その方向で提案を続けてしまいます。

副操縦士なので、操縦士には逆らってこないですね。

とはいえ最初は```iter(train_loader)```を提案してきたので、このGitHub Copilotの提案を無視した操縦士（私）が悪いです。

**GitHub Copilotが綺麗で最適なコードを書く手本を示してくれる可能性も感じる瞬間でした。**


<br>それではMNISTデータローダーから一枚の画像を描画する様子の動画を示します。
（再掲）動画は最初、画面を最大化したときは画質が粗いですが、少しすると綺麗になります。
<br>

<iframe width="560" height="315" src="https://www.youtube.com/embed/AbiYdTnzdG8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


## ２. 関数の作成・実行と、docstringの自動作成

ここまで、Jupyter Notebook形式で各セルにダラダラとコードを記述しましたが、きちんと関数化して、それを使用するように実装してみます。
その場合のGitHub Copilotの様子を観察しましょう。

関数化の内容は、「ミニバッチ内の全ての画像を描画する」とします。

### 画像の描画を関数化

ということで、「ミニバッチ内の全ての画像を描画する」関数を実装します。

まず、```def show```と打ち込むと、即座にGitHub Copilotが一瞬にして続きを提案してきました。

```python 
def show_batch(imgs):
    grid = torchvision.utils.make_grid(imgs)
    plt.imshow(grid.numpy().transpose(1, 2, 0), cmap='gray')
```

私は```torchvision.utils.make_grid()```関数を使って実装する気はなかったのですが、確かにこの方法の方が短いですし、良いです。

私は ```def show```しか打ちこんでいなかったので、心を見透かされたかのような瞬間でした。

副操縦士から、踏み込み、先回りした提案をもらった感じです。

単純にこれまでの実装の流れからして```def show```と打ち込めば、ベイズ推定的に、世の中の多くの人はミニバッチの中身を可視化したいケースが多いから、その方法をGitHub Copilotが提案してくれただけなのですが、これは優秀です。

確実にコーディング時間が短くなった瞬間でした。


<br>それではミニバッチの画像を全て描画する関数の実装と実行の様子を動画を示します。
（再掲）動画は最初、画面を最大化したときは画質が粗いですが、少しすると綺麗になります。
<br>


<iframe width="560" height="315" src="https://www.youtube.com/embed/chcFW6pnYzA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


### 関数へのコメントでの解説（docstring）の自動生成
最後にこのミニバッチの画像を描画する関数に対して、docstring（コメントでの説明）を記述します。

最初に「Generate Docstring」を右クリックして実行していますが、これはGitHub Copilotではなく別の拡張機能に用意されているものです。

そしてGoogle Styleのdocstringのテンプレートが自動挿入されます。

<br>まず、関数内容の説明を書きます。
thisとだけ打ち込むと、関数の説明として

```this function is to show the batch of images```

と関数内容を文章にしてくれました。とても楽です。

ちなみに日本語で
この関数は、と打ち込むと

```この関数は、batch_size = 32のときに、batch_size = 32の数字を表示する。```
と提案してきて、アカンです。

GitHub Copilotを日本語でうまく利用するのは難しいかもしれないと感じました。

ですが、関数内容からその要約説明文を自動生成してくれてとても助かります。<br>


続いて引数の説明部分です。テンプレートとして

```python
Args:
        imgs (_type_): _description_
```

となっているので、```imgs(```の状態まで削除します。

すると、

```imgs (torch.Tensor): batch of images```

と続きの入力内容として、引数の変数の型、そしてその説明まで提案してくれました。
問題ないので、[Tab]キーを押して採用です。

私はdocstringを丁寧に書くのを少し面倒に感じてしまうので（大切なのですが）、こうした副操縦士は非常にありがたいです。<br>

最後に関数の変数と返り値として「型ヒント」を入力します。

```def show_batch(imgs):```となっているのを、型ヒントを書き込むために最後の部分を削除し、
```def show_batch(imgs```とすると、GitHub Copilotが

```def show_batch(imgs: torch.Tensor):```と提案してくれました。
ありがとうございます。

続いて返り値の型ヒントを書くために、```):```の間に「-」ハイフンを入力すると、

```) -> None:```
と型ヒントの記載と、正しく返り値の型（今回の関数は返り値がないのでNoneが正しい）を提案してくれました。

[Tab]キーを押して採用です。



<br>以上のdocstringと型ヒントを実装する様子を動画を示します。
（再掲）動画は最初、画面を最大化したときは画質が粗いですが、少しすると綺麗になります。
<br>


<iframe width="560" height="315" src="https://www.youtube.com/embed/s8DgpinHOrE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


## ３. さいごに

以上、本記事ではVScodeのGitHub Copilot拡張機能を使用しつつ、Python、PyTorchで実装を少しだけ試した内容を動画付きで紹介しました。

もう少し長い期間試してみなければ、最も良い活用方法は見えてこないのですが、確実に「とても賢い入力補完」機能として役立ちそうな気はします。

とくに
・テスト駆動開発の最初の単体テストの作成
・Pythonの場合、DjangoやDjango Rest framework、Flask、FastAPIなどを使用したWebアプリの作成
・コメントやdocstringなどの自動生成
（※ただし私は細々としたコメントが必要なコードはコード自体、もしくは読み手の英語力とコードを読む力の課題であり、「短いが複雑な処理」の理解を助けるためのコメントのみが必要と考えています）

といった内容の方が、
データサイエンス的なコーディングよりも、さらに有効に活用できそうな気がしました。


以上、ご一読いただき、ありがとうございました。


---

**【記事執筆者】**
[電通国際情報サービス（ISID）AIトランスフォーメーションセンター](https://isid-ai.jp/) 製品開発Gr
小川 雄太郎
主書[「つくりながら学ぶ! PyTorchによる発展ディープラーニング」](https://www.amazon.co.jp/dp/4839970254/) 
自己紹介[（詳細はこちら）](https://github.com/YutaroOgawa/about_me)

【情報発信】
**Twitterアカウント**：[小川雄太郎@ISID_AI_team](https://twitter.com/ISID_AI_team)

IT・AIやビジネス・経営系情報で、面白いと感じた記事やサイトを、Twitterで発信しています。

【免責】
本記事の内容そのものは執筆者の意見/発信であり、執筆者が属する企業等の公式見解ではございません

---