0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

M4 の Mac mini でローカルLLM: Qwen3-Coder-30B-A3B-Instruct(量子化された MLX版モデル)を MLX LM で試す

Last updated at Posted at 2025-08-02

はじめに

公式からは以下でポストされていた Qwen/Qwen3-Coder-30B-A3B-Instruct について、量子化された MLX版モデルを試した話です。

使ったモデルとお試し用環境

今回用いた、MLX版で量子化されたものの 1つは以下になります。

●mlx-community/Qwen3-Coder-30B-A3B-Instruct-3bit · Hugging Face
 https://huggingface.co/mlx-community/Qwen3-Coder-30B-A3B-Instruct-3bit

image.png

3ビットの量子化で、以下の 13GB強という合計サイズになっているものです。

image.png

今回使った自分が持っている環境の1つである「M4 の Mac mini(メモリ 24GB)」では、過去にローカルLLM を試してきてユニファイドメモリ 24GB のうち 16GB がローカルLLM のモデル用に使えている、という状況でした。

そのため、そのメモリの制約下で動く最大のモデルサイズのものを選んでいます。

直近のローカルLLM のお試し

ローカルLLMは、今回使った M4 の Mac mini を入手してから試し始めて、その後、Windowsマシンでやってみたり、直近で買った M4 の MackBook Air でも試しています。

それで記事も書いていて、例えば直近では以下などを投稿しています。

さっそく試す

さっそく試していきます。

今回の環境

今回使った環境は以下のとおりです。

  • PC: M4 Mac mini(メモリ 24GB)
  • モデルを実行する環境
    • Python標準の仮想環境(venv を利用)
    • 仮想環境下で MLX LM でモデルを利用
  • モデル: Qwen3-Coder-30B-A3B-Instruct

試した結果

MLX LM を使い、実行したコマンドは以下のとおりです。

mlx_lm.generate --model mlx-community/Qwen3-Coder-30B-A3B-Instruct-3bit --prompt "p5.jsのパーティクルのプログラム" --max-tokens 512

とりあえず動作確認的なものだったので、細かな指定はせずに、ざっくりとした依頼で試しました(プロンプト「p5.jsのパーティクルのプログラム」)。

それでできあがったものは、以下のとおりです。

出力された回答

まず、出力された回答の画像キャプチャです。

image.png

image.png

image.png

シンプルにコードが提示された、というような回答結果でした。
なお、最後の部分は以下のようになっており、メモリ利用のピークは 13.447 GB だったようです。

==========
Prompt: 19 tokens, 88.024 tokens-per-sec
Generation: 512 tokens, 55.083 tokens-per-sec
Peak memory: 13.447 GB

特に警告などもなく、メモリに余裕がある状態で実行されました。

出力されたコードの実行結果

出力されたコードの実行結果を示します。
以下は、出力されたコードを p5.js Web Editor で実行したものです。

プロンプトは「p5.jsのパーティクルのプログラム」という細かな指定がないものでしたが、実装を見てみると「パーティクルクラス」が作られており、その中にはパーティクルでよく使われるパラメータも作られていました(位置・速度・加速度・ライフタイムなど)。

今回の動作確認的な内容は上記でも十分ですが、今後、プロンプトでもっと具体的な実装内容を書いてみたりなど、色々試していければと思いました。

出力された回答(テキスト版を折りたたみで)

以下は、出力された回答のテキスト版です。長いので折りたたみにしています。

【折りたたみ】プロンプトと回答全体
(myenv) % mlx_lm.generate --model mlx-community/Qwen3-Coder-30B-A3B-Instruct-3bit --prompt "p5.jsのパーティクルのプログラム" --max-tokens 512
Fetching 14 files: 100%|████████████████████| 14/14 [00:00<00:00, 123882.40it/s]

==========
以下は、`p5.js` を使用したパーティクルシステムの基本的な実装例です。このコードは、キャンバス上にパーティクル(点)を生成し、動き続けるようにします。

```javascript
// p5.js でパーティクルを生成する基本的なコード

// パーティクルクラス
class Particle {
  constructor(x, y) {
    this.pos = createVector(x, y);
    this.vel = p5.Vector.random2D();
    this.vel.mult(random(1, 3));
    this.acc = createVector(0, 0);
    this.size = random(5, 15);
    this.lifespan = 255;
  }

  // 更新処理
  update() {
    this.vel.add(this.acc);
    this.pos.add(this.vel);
    this.acc.mult(0); // 加速度をリセット
    this.lifespan -= 2;
  }

  // 描画
  display() {
    noStroke();
    fill(255, this.lifespan);
    ellipse(this.pos.x, this.pos.y, this.size);
  }

  // 力を加える
  applyForce(force) {
    this.acc.add(force);
  }

  // パーティクルが生きているか
  isDead() {
    return this.lifespan < 0;
  }
}

// パーティクルの配列
let particles = [];

function setup() {
  createCanvas(600, 600);
  // パーティクルを生成
  for (let i = 0; i < 100; i++) {
    particles.push(new Particle(random(width), random(height)));
  }
}

function draw() {
  background(50);

  // パーティクルを更新・描画
  for (let i = 0; i < particles.length; i++) {
    particles[i].update();
    particles[i].display();

    // 画面外に出たら削除
    if (particles[i].isDead()) {
      particles.splice(i, 1);
      i--;
    }
  }

  // 一定確率で新しいパーティクルを追加
  if (random(1) < 0.1) {
    particles.push(new Particle(random(width), random(height)));
  }
}
```

###
==========
Prompt: 19 tokens, 88.024 tokens-per-sec
Generation: 512 tokens, 55.083 tokens-per-sec
Peak memory: 13.447 GB
0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?