はじめに
公式からは以下でポストされていた 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
3ビットの量子化で、以下の 13GB強という合計サイズになっているものです。
今回使った自分が持っている環境の1つである「M4 の Mac mini(メモリ 24GB)」では、過去にローカルLLM を試してきてユニファイドメモリ 24GB のうち 16GB がローカルLLM のモデル用に使えている、という状況でした。
そのため、そのメモリの制約下で動く最大のモデルサイズのものを選んでいます。
直近のローカルLLM のお試し
ローカルLLMは、今回使った M4 の Mac mini を入手してから試し始めて、その後、Windowsマシンでやってみたり、直近で買った M4 の MackBook Air でも試しています。
それで記事も書いていて、例えば直近では以下などを投稿しています。
- Ollama: v0.10.0 でアプリに対話用の GUI がついたようなので軽く試してみる - Qiita
- M4 の MacBook Air でローカルLLM: Gemma 3n を MLX-VLM と Ollama で試す - Qiita
- Apple がリリースしたモデル「DiffuCoder」の MLX版を試して出たエラーの情報を少し探ってみた(M4 Mac mini でローカルLLM) - Qiita
- M4 の Mac mini でローカルLLM: Gemma 3n を MLX LM・MLX-VLM で試す(画像入力を試したものはエラーが出て未解決 ← その後解決) - Qiita
さっそく試す
さっそく試していきます。
今回の環境
今回使った環境は以下のとおりです。
- 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のパーティクルのプログラム」)。
それでできあがったものは、以下のとおりです。
出力された回答
まず、出力された回答の画像キャプチャです。
シンプルにコードが提示された、というような回答結果でした。
なお、最後の部分は以下のようになっており、メモリ利用のピークは 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