ショートストーリー: 「GPUの彼方へ」
東京の喧騒の中、千代田区の小さなオフィスで働くプログラマ、佐藤健一は、常に最先端の技術を追い求める男だった。彼はコーヒーの香りが漂うデスクで、CuPyを駆使してGPU計算を行うことに夢中だった。彼の夢は、並列計算を駆使して、大規模データをリアルタイムで処理することだった。
「まただめか…」 健一はモニターに映るエラーコードにため息をついた。今日で3日目の試行錯誤。彼が挑んでいるのは、CuPyを使った大規模計算の最適化。メッシュグリッドを駆使して、膨大なデータを一気に処理しようとしていた。
窓の外には、夕日が高層ビルの間から差し込んでいた。東京の夜が静かに訪れようとしている。しかし、健一の戦いはこれからだった。彼の頭の中には、コードのロジックが無限に広がるフラクタルのように入り乱れていた。
「何かが足りない…」 彼はもう一度CuPyのドキュメントを読み返し、頭を抱えた。
そんなとき、ふと彼の目に浮かんだのは、昔読んだ物理学の教科書の一節だった。「シンプルさが美しさだ」。その言葉が彼の心に突き刺さった。
「そうか、もっとシンプルにすればいいんだ」 彼はひらめいた。
健一はすぐにキーボードを叩き始めた。今までの複雑なコードを一旦削除し、新たなアプローチでコードを書き直す。CuPyを使い、メッシュグリッドを作成してデータを並列計算にかける。しかし、今回は余計な処理を一切省いた、シンプルかつ効率的なアプローチだった。
数分後、彼の指が止まる。そして、深呼吸をして実行ボタンを押した。
数秒の静寂がオフィスを包む。健一はスクリーンをじっと見つめていた。そして──。
「やった!」 彼は小さく叫んだ。モニターにはエラーメッセージではなく、彼が求めていた正しい計算結果が表示されていたのだ。
この成功は、彼にとって単なる仕事の一部ではなかった。これは、彼が技術の最前線に立ち、挑戦し続ける姿勢を証明するものだった。東京の喧騒の中で、健一は今日もまた一歩、未来に近づいたのだ。
実行結果。
入力テキスト
import numpy as np
a = np.array([1, 2])
result = np.zeros(len(a))
for i in range(len(a)):
result[i] = a[i] * 2
サンプルプロンプト
CuPyライブラリを使用して、GPU上で動くコードを生成してください。
言語モデルの応答
このコードは、cupyライブラリを使用してnumpyの配列をコピーし、その要素を2倍にします。
import cupy as cp
# cupyライブラリのインポート
a = cp.array([1, 2])
# 配列aをコピー
result = cp.zeros_like(a)
# 配列aの要素を2倍に変更
for i in range(len(a)):
result[i] = a[i] * 2
結果として result
の要素は a
の要素を2倍にしています。これは、cp.zeros_like(a)
を使用して a
の形状とサイズが保持されます。また、for
ループを使って a
の要素を順番に更新しています。
プログラミングエディタ
import cupy as cp
# cupyライブラリのインポート
a = cp.array([1, 2])
# 配列aをコピー
result = cp.zeros_like(a)
# 配列aの要素を2倍に変更
for i in range(len(a)):
result[i] = a[i] * 2
print (result)
実行結果
[2 4]
Qwen AIによる、自動で高効率なGPU対応コードに変換するプログラム。
!pip install gradio
# 必要なライブラリのインストール
!pip install accelerate gradio transformers cupy
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
import gradio as gr
import subprocess
import re
# GPUが利用可能かどうかをチェック
device = "cuda" if torch.cuda.is_available() else "cpu"
# 言語モデルとトークナイザーの読み込み
language_model_name = "Qwen/Qwen2-1.5B-Instruct"
language_model = AutoModelForCausalLM.from_pretrained(
language_model_name,
torch_dtype="auto",
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(language_model_name)
def generate_code(prompt):
try:
# プロンプトに基づいてコードを生成
messages = [
{"role": "system", "content": "あなたは優れたプログラミングアシスタントです。"},
{"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(device)
generated_ids = language_model.generate(
model_inputs.input_ids,
max_new_tokens=512
)
generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
return response
except Exception as e:
return f"コード生成エラー: {str(e)}"
def extract_python_code(response):
code_match = re.search(r'```python(.*?)```', response, re.DOTALL)
if code_match:
code = code_match.group(1).strip()
return code
else:
return "Pythonコードが見つかりませんでした。"
def execute_code(code):
try:
# 生成されたコードをファイルに保存して実行
with open("generated_code.py", "w") as file:
file.write(code)
result = subprocess.run(["python", "generated_code.py"], capture_output=True, text=True)
return result.stdout if result.returncode == 0 else result.stderr
except Exception as e:
return f"コード実行エラー: {str(e)}"
def handle_interaction(input_text, sample_prompt):
prompt = input_text or sample_prompt
response = generate_code(prompt)
code = extract_python_code(response)
return response, code
def handle_code_execution(code):
result = execute_code(code)
return result
# サンプルプロンプト
sample_prompts = [
"CuPyライブラリを使用して、GPU上で動くコードを生成してください。",
"CuPyライブラリと cp.meshgrid を使用して、GPU上で動くコードを生成してください。"
]
with gr.Blocks() as iface:
gr.Markdown("# 日本語プログラミングアシスタント")
with gr.Row():
with gr.Column():
input_text = gr.Textbox(label="入力テキスト")
sample_prompt = gr.Dropdown(sample_prompts, label="サンプルプロンプト")
generate_button = gr.Button("チャットの応答を生成")
response_output = gr.Textbox(label="言語モデルの応答")
with gr.Column():
code_editor = gr.Textbox(label="プログラミングエディタ", lines=15)
execute_button = gr.Button("コードを実行")
execution_result_output = gr.Textbox(label="実行結果", lines=10)
generate_button.click(handle_interaction, inputs=[input_text, sample_prompt], outputs=[response_output, code_editor])
execute_button.click(handle_code_execution, inputs=[code_editor], outputs=execution_result_output)
if __name__ == "__main__":
iface.launch(debug=True)
説明:
CuPyライブラリの使用: CuPyは、NumPyと互換性のある構文を持つGPU計算ライブラリです。このコードでは、CuPyライブラリを使用してGPUコードを生成するプロンプトを提供します。
プロンプトの選択: サンプルプロンプトでは、CuPyライブラリを使用したコードと、メッシュグリッドを使用したコード(ダメ)の2種類を選択できるようにしています。
実行: 生成されたコードは、Pythonファイルとして保存され、その後実行されます。実行結果は、UIで確認できます。
これにより、CuPyを使用したGPUコードの生成と実行が可能になります。