Python、Java、JavaScriptのコードを自動生成できるプログラムコード生成AI「santacoder」をローカル(オフラインWindows)環境で動かし、実用に耐えるものか試してみた備忘録です。
ある程度のグラボと5GB程度のストレージさえあれば誰でも扱えます。
例えば「def show_all_png_image_file_name(filedir):」というプロンプトで、以下のようにコードが生成されました。生成には2.3秒程度しかかかりません。
生成部分は緑色になっている箇所で、私が入力したのは太字部分だけです。
プロンプト(例def print_hey(name):) : def show_all_png_image_file_name(filedir):
出力の長さ(例20とか) : 80
def show_all_png_image_file_name(filedir):
"""
列出所有png图片文件
:param filedir:
:return:
"""
file_list = os.listdir(filedir)
for file in file_list:
if file.endswith(".png"):
print(file)
もちろんコピペしてモジュールをインポートするだけで使えるものでした。
応答速度は動画のとおりです。
1,事前準備と「santacoder」解説
プログラム生成AI「santacoder」とは

santacoderとはマイクロソフトに取り入れられたOpenAIとは異なり、誰でもアクセスできる公開されたAIを目指した「BigCode プロジェクト」が作成したプログラムのコード生成AIモデルです。
Python、Java、および JavaScriptのソースコードでトレーニングされており、その3言語を生成できます。
この記事ではPythonコードの生成について実践していきます。
なお学習元ソースコードのコメントなどは大部分が英語のため、AIへは英語で指示する必要があります。
動かすための諸々インストール
pythonとtransformersが必要です。
Python3.10をインストール & パスを通す
当方で動作確認が取れているのはPython3.10.7のためそれをインストールしていますが、多分バージョンを合わせなくても大丈夫です。
Pythonがまだインストールされていない方は以下の手順に従ってPythonをWindowsにインストールしてください。
PythonのインストールとPATHへの追加が終わっている前提で次に進みます。
あとは必要なモジュール「transformers」をpip installコマンドでインストールしていきます。
次に「transformers」をpipでインストール
コマンドプロンプトにコマンドをコピペしてエンターキーを押してください。
コマンドプロンプトはWindowsキーを押した後、「cmd」と打ち込みエンターキーを押すと起動できます。
管理者権限は不要です。

追加で必要なのは以下の1つだけです。
pip install transformers
これでソースコード自動生徒が行えます。
2,公式サンプルコードを動かす
# pip install -q transformers
from transformers import AutoModelForCausalLM, AutoTokenizer
checkpoint = "bigcode/santacoder"
device = "cuda" # for GPU usage or "cpu" for CPU usage
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModelForCausalLM.from_pretrained(checkpoint, trust_remote_code=True).to(device)
inputs = tokenizer.encode("def print_hello_world():", return_tensors="pt").to(device)
outputs = model.generate(inputs)
print(tokenizer.decode(outputs[0]))
上記コードを全文コピペして、適当な名前をつけて保存してください。
拡張子は.pyにすること!!
初回実行時はモデル(約5GB)のダウンロード処理で数分かかります。
Downloading: 100%|███████████████████████████████████████████████████████| 2.08M/2.08M [00:01<00:00, 1.71MB/s]
Downloading: 100%|███████████████████████████████████████████████████████████| 138/138 [00:00<00:00, 25.6kB/s]
Downloading: 100%|███████████████████████████████████████████████████████████████████| 948/948 [00:00<?, ?B/s]
Explicitly passing a revision
is encouraged when loading a configuration with custom code to ensure no malicious code has been contributed in a newer revision.
Downloading: 100%|███████████████████████████████████████████████████████| 9.47k/9.47k [00:00<00:00, 3.11MB/s]
Explicitly passing a revision
is encouraged when loading a model with custom code to ensure no malicious code has been contributed in a newer revision.
Downloading: 100%|███████████████████████████████████████████████████████| 15.1k/15.1k [00:00<00:00, 86.5kB/s]
Downloading: 58%|███████████████████████████████▊ | 2.66G/4.60G [03:00<01:54, 16.9MB/s]
その後以下のような結果が出力されました。
The attention mask and the pad token id were not set. As a consequence, you may observe unexpected behavior. Please pass your input's attention_mask
to obtain reliable results.
Setting pad_token_id
to eos_token_id
:50256 for open-end generation.
C:\Users\loveanime\AppData\Local\Programs\Python\Python310\lib\site-packages\transformers\generation_utils.py:1359: UserWarning: Neither max_length
nor max_new_tokens
has been set, max_length
will default to 20 (self.config.max_length
). Controlling max_length
via the config is deprecated and max_length
will be removed from the config in v5 of Transformers -- we recommend using max_new_tokens
to control the maximum length of the generation.
warnings.warn(
def print_hello_world():
print("Hello World!")
入力したプロンプト「def print_hello_world():」に対して「print(“Hello World!”)」と出力しているので、動作確認はOK。
プロンプトと合わせて指定すべき諸々のパラメーターが全然指定されてない!!と怒られてるので、怒られないようにしつつ使いやすくしていきます。
3,使いやすいカスタム版コード
コード(コピペでOK)
モデルの読み込みに毎度時間がかかるので、出力のたびにプログラム終了しないようにしました。
あわせて、いちいちプログラムにプロンプトを書き込むのは実用的でないため、黒い画面(ターミナル)で諸々入力できるように改良。
- プロンプト
- 出力の長さ
以上2つを入力できるようにしました。
from transformers import AutoModelForCausalLM, AutoTokenizer
checkpoint = "bigcode/santacoder"
device = "cuda" # for GPU usage or "cpu" for CPU usage
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModelForCausalLM.from_pretrained(checkpoint, trust_remote_code=True).to(
device
)
while True:
prompt = input("プロンプト(例def print_hey(name):) : ")
max = input("出力の長さ(例20とか) : ")
inputs = tokenizer.encode(prompt, return_tensors="pt").to(device)
output_ids = model.generate(
inputs.to(model.device),
max_length=int(max),
pad_token_id=49152,
eos_token_id=49152,
)
outputs = tokenizer.decode(output_ids.tolist()[0])
print(outputs + "\n")
実演してみる
プロンプト(例def print_hey(name):) : def count_down_100_to0():
出力の長さ(例20とか) : 50
def count_down_100_to0():
for i in range(100, 0, -1):
print(i)
プロンプト(例def print_hey(name):) : def show_all_png_image_file_name(filedir):
出力の長さ(例20とか) : 80
def show_all_png_image_file_name(filedir):
"""
列出所有png图片文件
:param filedir:
:return:
"""
file_list = os.listdir(filedir)
for file in file_list:
if file.endswith(".png"):
print(file)
結構いい感じですね。
出力そのままだとインポート必要なモジュールとかが無いと怒られるので、必要な所を取り出してVSCodeのエラーに従って数行書けばもうコード完成です。

例えばこんな具合に。
import os
filedir = "C:/Users/loveanime/Pictures/壁紙"
file_list = os.listdir(filedir)
for file in file_list:
if file.endswith(".png"):
print(file)
緑はAI生成部分です。人間の私は太文字の上2行しか書いていません。
ちゃんと以下のようにPNG画像の名前も取得でき、目的通りの動作をしました。
IMG_6101.png
IMG_6102.png
IMG_6110.png
効率化にいいですね!
手元の3090だと大体1秒で出力長さ30くらい生成します。
上記のファイル名取得のプログラムは生成に2,3秒ってところです。
動画のとおりサクサク動きます。
4,他の面白いAIを動かす
アニメ系の音声生成AI「MoeGoe」(text to voice)
無料&無制限の200言語以上翻訳できるAI「NLLB200」をWindowsのPythonで動かす
文字起こしAI「Whisper」(voice to text)