Zenn
💨

Gemma3(+ LM Studio)触ってみた

2025/03/19に公開

3/12日にgoogleからGemma3がリリースされたので触ってみました。

LM Studio

GUIで完結できるLLMが実行できるアプリ。モデルのダウンロードなどもできるのでこれ1つ入れておけば完結する。
Mac/Windows/Linux対応
https://lmstudio.ai

install

get your first LLMを押すとDeepSeek R1の7Bモデルをお薦めされました。
が、今回はGemma3を使うのでskip onboardingします。

左のメニューから🔍アイコンをクリック


ダウンロードサイズは以下の通り。

1B 4B 12B 27B
806MB 3.34GB 8.15GB 15.40GB

それぞれ動かすのに必要なメモリサイズは以下の通り。
今動かしているのはm2 mac/16GBなので32bitで動かすなら4Bモデルすらメモリに乗らないですね。

https://ai.google.dev/gemma/docs/core?hl=ja

実行

Gemma3 4Bモデルをロードしました。
LMStudioは右下にメモリとCPU使用量が出るのがいいですね。

今回利用したのはQ4_K_Mの4bitなので上記の表だと3.4GBくらいのメモリ消費想定。
LM Studioの表示では3.1GBなのでほぼ想定通りでしょうか。

モデルダウンロード時に量子化の種類を選べるのですが、使っているPCに不釣り合いな場合は警告が出ているのも親切。

実行結果1

gemma3のモデルの種類を教えてください。加えてそのモデルごとの強みや使い分けの方法も教えてください。

書いてあることが大嘘なのは置いておくとして、日本語としては割と真っ当なものが十分な速度で出力されました。CPU使用率も10%前後。
全文は長いので見たい人だけどうぞ。

Gemmaの出力
Gemma 3 は、いくつかの異なるサイズとトレーニング方法で提供されており、それぞれに独自の強みがあります。以下に主なモデルとその特徴、使い分けについてまとめます。

1. Gemma-3B:
サイズ: 30億パラメータ
強み: コストパフォーマンスに優れ、様々なタスクに適しています。特に、リソースが限られた環境や、小規模なプロジェクトでの利用に向いています。
使い分け: テキスト生成、要約、翻訳など、幅広い用途で基本的な性能を発揮します。プロトタイピングや、低コストで試したい場合に最適です。

2. Gemma-7B:
サイズ: 70億パラメータ
強み: 3Bモデルよりも高い精度と複雑なタスクへの対応力を持っています。より高度なテキスト生成、創造的なコンテンツ作成、複雑な質問応答などに適しています。
使い分け: より高品質なアウトプットを求める場合や、複雑な指示に対応できるモデルが必要な場合に選択します。

3. Gemma-13B:
サイズ: 130億パラメータ
強み: 最も高い性能を持つGemma 3のモデルです。非常に複雑なタスク、高度な推論、創造的なコンテンツ生成において優れた結果を期待できます。
使い分け: 最高レベルの精度とパフォーマンスが求められる場合に最適です。研究開発や、最先端のアプリケーションでの利用に適しています。

4. Gemma-Guanaco (Instruction-Tuned):
サイズ: 3B, 7B, 13B
強み: 指示に従う能力が大幅に向上しています。複雑な指示や、具体的なタスクを正確に実行できます。
使い分け: 指示に基づいたテキスト生成、コーディング支援、チャットボットなど、指示応答型のアプリケーションに適しています。

モデル選択のポイント:
タスクの複雑さ: 複雑なタスクには、より大きなモデル(7B, 13B)が必要です。
リソース: モデルサイズが大きいほど、計算資源(GPUメモリなど)が必要になります。
コスト: より小さなモデルは、トレーニングと実行にかかるコストが低くなります。
精度要件: 高い精度を求める場合は、より大きなモデルを選択します。

まとめ:
モデル	サイズ	強み	使い分け
Gemma-3B	30億パラメータ	コストパフォーマンス、汎用性	プロトタイピング、小規模プロジェクト
Gemma-7B	70億パラメータ	高精度、複雑なタスクへの対応力	高品質なアウトプット、高度なテキスト生成
Gemma-13B	130億パラメータ	最高レベルの性能、推論能力	研究開発、最先端アプリケーション
Gemma-Guanaco	3B, 7B, 13B	指示に従う能力、指示応答型タスク	指示応答型チャットボット、コーディング支援
より詳細な情報や比較については、Google の公式ドキュメントをご参照ください。

ご不明な点があれば、お気軽にご質問ください。

表示したい内容

実行結果2

Gemma3は画像も渡せるのでTERASSのトップページ画像を渡してhtml生成してもらいました。

画像のようなウェブサイトを作ってください

出力されたサイトがこんな感じ。
画像の文字をある程度は読めてますが精度は低い。
またCPU使用率が瞬間的に跳ね上がったので画像読み込みはかなり負荷が高そう。

Gemmaの出力
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>TERASS</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>

    <header>
        <h1>TERASS</h1>
        <nav>
            <ul>
                <li><a href="#">About</a></li>
                <li><a href="#">Service</a></li>
                <li><a href="#">News</a></li>
                <li><a href="#">Recruit</a></li>
                <li><a href="#">Contact</a></li>
            </ul>
        </nav>
    </header>

    <main>
        <section class="hero">
            <h2>いじめ取り引は、いいエージェントから。</h2>
            <p>できる当たり前にするプラットフォームをつくる。</p>
        </section>

        <section class="image-section">
            <img src="placeholder_image1.jpg" alt="人物写真1">
            <img src="placeholder_image2.jpg" alt="人物写真2">
            <img src="placeholder_image3.jpg" alt="人物写真3">
        </section>

        <section class="links">
            <div><a href="#">住家購入・売却とはおけいめ</a></div>
            <div><a href="#">不動産件分析者の方はこちら</a></div>
            <div><a href="#">営業情報ギャラリー</a></div>
            <div><a href="#">TERASS お客様サポートライン</a></div>
        </section>

    </main>

    <footer>
        <p>© 2023 TERASS. All rights reserved.</p>
    </footer>

</body>
</html>

body {
    font-family: sans-serif;
    margin: 0;
    padding: 0;
    background-color: #f4f4f4;
}

header {
    background-color: #333;
    color: white;
    padding: 1rem 0;
    text-align: center;
}

nav ul {
    list-style: none;
    padding: 0;
    margin: 0;
}

nav li {
    display: inline;
    margin: 0 1rem;
}

nav a {
    color: white;
    text-decoration: none;
}

.hero {
    background-color: #fff;
    padding: 2rem;
    text-align: center;
    border-bottom: 1px solid #ccc;
}

.image-section {
    display: flex;
    justify-content: space-around;
    margin-top: 2rem;
}

.image-section img {
    width: 30%;
    height: auto;
}

.links {
    text-align: center;
    padding: 1rem 0;
}

.links div {
    display: block;
    margin-bottom: 0.5rem;
}

footer {
    background-color: #333;
    color: white;
    text-align: center;
    padding: 1rem 0;
    position: fixed;
    bottom: 0;
    width: 100%;
}

実行結果3

type-challengeを解かせてみました。

組み込みの型ユーティリティReturnType<T>を使用せず、Tの戻り値の型を取得する型を実装してください。

例えば

const fn = (v: boolean) => {
if (v)
return 1
else
return 2
}

type a = MyReturnType<typeof fn> // should be "1 | 2"

これは正解しました。

Gemmaの出力
type MyReturnType<T extends (...args: any[]) => any> = T extends (...args: any[]) => infer ReturnType ? ReturnType : never;

// 例:
const fn = (v: boolean) => {
  if (v)
    return 1
  else
    return 2
}

type a = MyReturnType<typeof fn>; // should be "1 | 2"

const fn2 = (x: number) => x * 2;
type b = MyReturnType<typeof fn2>; // should be "number"

const fn3 = (): string => "hello";
type c = MyReturnType<typeof fn3>; // should be "string"

// 型エラーを発生させる例:
// type d = MyReturnType<> // エラー: Argument of type 'never' is not assignable to parameter of type 'any'.

解説:

MyReturnType<T extends (...args: any[]) => any>: これはジェネリック型 MyReturnType を定義しています。

T extends (...args: any[]) => any: T は関数型のジェネリックパラメータです。 extends (...) => any は、T が任意の引数を持つ関数 (つまり、引数の型が不明) であることを指定します。 これは、fn のような関数を MyReturnType に渡すことができるようにするために必要です。
infer ReturnType: これは TypeScript の強力な機能である 型推論 を使用しています。

T extends (...args: any[]) => infer ReturnType: この行は、T が関数を受け取った後、その関数の戻り値の型を推論する変数 ReturnType を定義します。 infer キーワードは、TypeScript に「この変数は、関数呼び出しの結果として推論される型を持つ」ことを伝えます。
ReturnType ? ReturnType : never: これは条件演算子です。

ReturnType ? ReturnType: ReturnType が存在する場合 (つまり、関数が戻り値を持っている場合)、その値を ReturnType として返します。
: never: ReturnType が存在しない場合 (つまり、関数が何も返さない場合) 、never 型を返します。 never は TypeScript の型であり、これは「この型は決して値を持たない」ことを意味します。 これは、関数が戻り値を返さない場合に適切です。
動作の仕組み:

MyReturnType<typeof fn> を呼び出すとき:

T は typeof fn になります (つまり、fn 関数の型)。
TypeScript は fn の戻り値の型を推論します。 fn は boolean 型の引数を受け取り、boolean が真の場合には 1 を返し、偽の場合は 2 を返します。 したがって、推論される ReturnType は 1 | 2 (1 または 2 の型) になります。
TypeScript は ReturnType (1 | 2) を MyReturnType の戻り値として返します。
なぜ組み込みの ReturnType<T> を使わないのか?

この実装は、TypeScript のジェネリック型システムと型推論を活用して、組み込みの ReturnType<T> 型を使用せずに、関数の戻り値の型を取得する方法を示しています。 ReturnType<T> は TypeScript の標準的な型であり、多くの場合に便利ですが、この課題では、組み込みの型を使用せずに実装する必要がありました。

補足:

このコードは、関数が引数を受け取ることを前提としています。 引数がなく、戻り値のみを持つ関数 (例: (): string) にも対応しています。
never 型は、TypeScript の強力な型であり、型システムをより正確に表現するために使用されます。
この回答があなたの質問の意図を理解し、役に立つことを願っています。

実行結果4

1つ目と同じ質問をgemma-3b-12b-it Q4_K_Mに投げてみました。

gemma3のモデルの種類を教えてください。加えてそのモデルごとの強みや使い分けの方法も教えてください。

メモリの使用量は8GB程度、CPU使用率が200-250%くらいになりました。
m2 macbook airでは実用できませんね。テキストの出力速度も遅いので、精度以前に使う気になれませんでした。

Gemmaの出力
Gemmaは、Google DeepMindによって開発されたオープンウェイト大規模言語モデル(LLM)です。いくつかの異なるモデルサイズとバリエーションが存在し、それぞれに特徴があります。

1. Gemma 2B

種類: パラメータ数が少ない軽量なモデル
強み:
高速な推論速度: 小さいため、応答が早く、リアルタイムアプリケーションに適しています。
低リソース要件: CPUやメモリなどの計算資源が限られた環境でも動作します。
エッジデバイスへの展開: スマートフォンや組み込み機器など、エッジデバイスでの利用に適しています。
使い分け:
リアルタイムチャットボット
モバイルアプリケーションの自然言語処理機能
リソース制約のある環境でのテキスト生成
2. Gemma 7B

種類: 中規模モデル
強み:
高い性能: 2Bモデルよりも多くのパラメータを持つため、より複雑なタスクを実行できます。
汎用性: テキスト生成、要約、翻訳など、幅広い用途に利用できます。
バランスの取れた性能とリソース要件: 比較的少ない計算資源で高い性能を発揮します。
使い分け:
コンテンツ作成(ブログ記事、メール、レポートなど)
質問応答システム
テキスト要約
プログラミング支援
3. Gemma 1.1B / 7B (Instruction-tuned)

種類: 指示応答に特化したモデル。Gemma 2B/7Bをベースに、指示に従う能力を高めるための追加学習(Instruction Tuning)を行っています。
強み:
指示への正確な追従: 与えられた指示や質問に対して、より適切で具体的な回答を生成します。
対話能力の向上: 自然で人間らしい会話が可能です。
タスク指向性: 特定のタスク(例:要約、翻訳、コード生成)を実行するための指示に最適化されています。
使い分け:
チャットボットやバーチャルアシスタント
タスク指向型アプリケーション
教育ツール
モデル選択のポイント

性能要件: より複雑なタスクを実行する必要がある場合は、パラメータ数が多いモデル(7B)を選択します。
リソース制約: 計算資源が限られている場合は、軽量なモデル(2B)を選択します。
用途: 指示に従う能力や対話能力が必要な場合は、Instruction-tunedモデルを選択します。
Gemmaはオープンウェイトモデルであるため、これらのモデルをベースに、特定のタスクに合わせてファインチューニングすることも可能です。

まとめ

ローカルLLMとして4Bは実行速度も速いし、簡単な壁打ちくらいなら普通に使える印象でした。
12B〜はグラボ必要な印象ですが、4Bでこの精度なら期待が持てます。

なおchatbot arenaだとgemma3 27Bは現在8位です。

Terass Tech Blog

Discussion

ログインするとコメントできます