3
4

Qwen AIによる、自動で高効率なGPU対応コードに変換するプログラム。

Last updated at Posted at 2024-08-17

c15b8aef-7103-418d-a931-87c2eedbcddd.png

ショートストーリー: 「GPUの彼方へ」

東京の喧騒の中、千代田区の小さなオフィスで働くプログラマ、佐藤健一は、常に最先端の技術を追い求める男だった。彼はコーヒーの香りが漂うデスクで、CuPyを駆使してGPU計算を行うことに夢中だった。彼の夢は、並列計算を駆使して、大規模データをリアルタイムで処理することだった。

「まただめか…」 健一はモニターに映るエラーコードにため息をついた。今日で3日目の試行錯誤。彼が挑んでいるのは、CuPyを使った大規模計算の最適化。メッシュグリッドを駆使して、膨大なデータを一気に処理しようとしていた。

窓の外には、夕日が高層ビルの間から差し込んでいた。東京の夜が静かに訪れようとしている。しかし、健一の戦いはこれからだった。彼の頭の中には、コードのロジックが無限に広がるフラクタルのように入り乱れていた。

「何かが足りない…」 彼はもう一度CuPyのドキュメントを読み返し、頭を抱えた。

そんなとき、ふと彼の目に浮かんだのは、昔読んだ物理学の教科書の一節だった。「シンプルさが美しさだ」。その言葉が彼の心に突き刺さった。

「そうか、もっとシンプルにすればいいんだ」 彼はひらめいた。

健一はすぐにキーボードを叩き始めた。今までの複雑なコードを一旦削除し、新たなアプローチでコードを書き直す。CuPyを使い、メッシュグリッドを作成してデータを並列計算にかける。しかし、今回は余計な処理を一切省いた、シンプルかつ効率的なアプローチだった。

数分後、彼の指が止まる。そして、深呼吸をして実行ボタンを押した。

数秒の静寂がオフィスを包む。健一はスクリーンをじっと見つめていた。そして──。

「やった!」 彼は小さく叫んだ。モニターにはエラーメッセージではなく、彼が求めていた正しい計算結果が表示されていたのだ。

この成功は、彼にとって単なる仕事の一部ではなかった。これは、彼が技術の最前線に立ち、挑戦し続ける姿勢を証明するものだった。東京の喧騒の中で、健一は今日もまた一歩、未来に近づいたのだ。

スクリーンショット 2024-08-07 144120.png

スクリーンショット 2024-08-07 144330.png

スクリーンショット 2024-08-07 144550.png

実行結果。

入力テキスト

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コードの生成と実行が可能になります。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4