以下の内容はhttps://touch-sp.hateblo.jp/entry/2025/06/04/164135より取得しました。


【Core Ultra iGPU】【llama.cpp】Gradio を使って翻訳アプリを作る


はじめに

Intel Core Ultra 200番台(第二世代)には 内蔵GPU(iGPU)としてArcグラフィックスが載っています。

そのArcグラフィックスを使って中規模の言語モデルを動かしてみました。

使用したPC

Copilot+PCに分類されるノートPCです。
「THIRDWAVE F-14LN5LA メモリ32GB搭載」

Windows 11 Home
Core Ultra 5 228V (Lunar Lake)
Intel Arc 130V GPU
32GBメモリ

NPUも載っていますが今回はiGPUを使いました。

言語モデルを動かす

「llama.cpp Portable Zip」というのを使って 「gemma-3-12b-it-GGUF 」を動かしました。

「llama-cpp-ipex-llm-2.3.0b20250605-win.zip」をこちらからダウンロードしました。使い方はこちら
「gemma-3-12b-it-GGUF 」はこちらからダウンロードしました。

このようなコマンドで実行しました。

llama-server -m ./models/ggml-org/gemma-3-12b-it-Q4_K_M.gguf -c 2048 -n 1024 -ngl 99



確かにiGPUが使われていそうです。

load_tensors: offloading 48 repeating layers to GPU
load_tensors: offloading output layer to GPU
load_tensors: offloaded 49/49 layers to GPU

Pythonスクリプト

import gradio as gr
from openai import OpenAI

# llama.cppのOpenAI互換APIサーバーに接続
client = OpenAI(
    base_url="http://localhost:8080/v1",  # llama.cppサーバーのURL
    api_key="dummy"  # llama.cppでは実際のAPIキーは不要
)

def translate_text(text, direction):
    """
    テキストを翻訳する関数
    direction: "en_to_jp" (英語→日本語) または "jp_to_en" (日本語→英語)
    """
    if direction == "en_to_jp":
        system_content = "あなたは英語から日本語への翻訳に特化した優秀なAIアシスタントです。回答は翻訳文にとどめ、日本語に翻訳するだけです。"
        user_content = f"次の英語を日本語に翻訳して下さい。\n{text}"
    else:  # jp_to_en
        system_content = "あなたは日本語から英語への翻訳に特化した優秀なAIアシスタントです。回答は翻訳文にとどめ、英語に翻訳するだけです。"
        user_content = f"次の日本語を英語に翻訳して下さい。\n{text}"

    prompt = [
        {
            "role": "system",
            "content": system_content,
        },
        {
            "role": "user",
            "content": user_content,
        }
    ]

    # llama.cppサーバーにリクエストを送信
    stream = client.chat.completions.create(
        model="gemma-3-12b-it-Q4_K_M",
        messages=prompt,
        stream=True,
        max_tokens=1024,
        temperature=0.0
    )

    result = ""
    for chunk in stream:
        if chunk.choices[0].delta.content is not None:
            result += chunk.choices[0].delta.content
            yield result

def translate_en_to_jp(text):
    """英語から日本語への翻訳"""
    yield from translate_text(text, "en_to_jp")

def translate_jp_to_en(text):
    """日本語から英語への翻訳"""
    yield from translate_text(text, "jp_to_en")

# Gradioインターフェースの構築(タブ形式)
with gr.Blocks(title="双方向翻訳アプリ") as demo:
    gr.Markdown("# 双方向翻訳アプリ")
    gr.Markdown("英語⇄日本語の翻訳ができます。")
    
    with gr.Tab("英語 → 日本語"):
        with gr.Row():
            en_input = gr.Textbox(
                lines=10, 
                max_lines=40, 
                label="英語", 
                placeholder="英語のテキストを入力してください..."
            )
            jp_output = gr.Textbox(
                lines=10, 
                max_lines=40, 
                show_copy_button=True, 
                label="日本語"
            )
        with gr.Row():
            en_to_jp_btn = gr.Button("翻訳", variant="primary")
            en_clear_btn = gr.Button("クリア", variant="secondary")
        
    with gr.Tab("日本語 → 英語"):
        with gr.Row():
            jp_input = gr.Textbox(
                lines=10, 
                max_lines=40, 
                label="日本語", 
                placeholder="日本語のテキストを入力してください..."
            )
            en_output = gr.Textbox(
                lines=10, 
                max_lines=40, 
                show_copy_button=True, 
                label="英語"
            )
        with gr.Row():
            jp_to_en_btn = gr.Button("翻訳", variant="primary")
            jp_clear_btn = gr.Button("クリア", variant="secondary")
    
    # イベントハンドラーの設定
    en_to_jp_btn.click(
        fn=translate_en_to_jp,
        inputs=en_input,
        outputs=jp_output
    )
    
    jp_to_en_btn.click(
        fn=translate_jp_to_en,
        inputs=jp_input,
        outputs=en_output
    )
    
    # クリアボタンの設定
    en_clear_btn.click(
        fn=lambda: "",
        outputs=en_input
    )
    
    jp_clear_btn.click(
        fn=lambda: "",
        outputs=jp_input
    )
    
    # Enterキーでも翻訳できるように設定
    en_input.submit(
        fn=translate_en_to_jp,
        inputs=en_input,
        outputs=jp_output
    )
    
    jp_input.submit(
        fn=translate_jp_to_en,
        inputs=jp_input,
        outputs=en_output
    )

# アプリケーションの起動
if __name__ == "__main__":
    demo.launch()

実行速度

llama-bench -m ./models/ggml-org/gemma-3-12b-it-Q4_K_M.gguf

gemma3 12B Q4_K - Medium 6.79 GiB 11.77 B SYCL 99 pp512 169.51 ± 9.89
gemma3 12B Q4_K - Medium 6.79 GiB 11.77 B SYCL 99 tg128 6.00 ± 0.41




以上の内容はhttps://touch-sp.hateblo.jp/entry/2025/06/04/164135より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14