GGUFをFastFlowLM使える様にするFLM Q4NXコンバーターを修正しフォークした
Amuse Anima LoRA修正の為に課金したGitHub Copilot proですが、残り使用率が70%程度とあまりにも余っているので、もう一つの困り事を解決してみようと思いました。
その困り事とは、FLM Q4NXコンバーターの修正です。
FLMとはFastFlowLM(以下FLM)の事で、AMD NPU2でLLMを動かすアプリです。NPU2とは第2世代のNPUを指します。
NPUでLLM動かせるようにするため、通常のGGUF形式では動かせず、FLM専用のフォーマットであるQ4NXへ変換する必要があります。
そのコンバータ(変換器)がFLM Q4NXコンバーターです。
このコンバーターですが、素の状態ではかなりバグが有り、実際に変換できるモデルは極めて限れられたものしかできませんでした。
また、変換しているのに(今回の検証で判りましたが、実際は変換されていない)実際に動かすとFLMアプリが落ちるというというなかなかのシロモノです。
変換した記録については、過去noteに記しています。
今回の最終目標は、FLMで扱える最新のqwen3.5やgemma4:E2Bを変換し、FLMで動作確認する事です。
・現状把握
先ずは変換を行いエラーを把握します。
モデルはできるだけオリジナルから離れたモデルで試すべく、gemma-4-E2B-it-ultra-uncensored-heretic-Q4_K_M.ggufとしました。
発生したエラー①:
Error unpacking Q4_K: Unsupported tensor type: BF16
このエラーは変換しようとしたモデルのあるテンソル(inp_gate.weightか*.proj.weight系)がQ4_K形式で量子化されている為発生しました。
具体的には、Q4_K はコンバータが直接デコードできる形式(F32/F16/BF16/Q4_0/Q4_1/Q8_0/MXFP4)で無いので、「デクオンタイズしてからdefault_tensor_typeに再クオンタイズする」フォールバック処理に入ります。しかし、BF16への“再クオンタイズ”は未実装でした。
発生したエラー②:
AttributeError: 'NoneType' object has no attribute 'shape'
①の未実装により(None, None, None)を返してしまいます。このNoneが返される事をコンバーターでは想定されていないので、②のエラーとなりました。
ここでQ4_K形式を取りやめ、同じモデルのBF16で変換を行いました。
BF16ではすんなり変換できました。
後に判明しましたが、このBF16変換も重大なバグが隠されていました。
それはさておき、Q4_K形式を変換するためにBF16への“再クオンタイズ”を実装しました。
修正内容 (q4nx\gguf_tensor.pyのunpack()):
if default_tensor_type ==GGMLQuantizationType.BF16:
# BF16は量子化不要なので、デクオンタイズしたテンソルをそのまま返す
return [w]
この修正によりQ4_K_Mが変換出来るようになりました。
この時点で当初の目標であるgemma4:E2Bの変換に成功している様に見えます。
しかし、コンバーターの本当問題と向き合ったのはここからです。
上記や過去のnoteにも書きましたが、コンバート出来ても実際にFLMで使用しようとすると、FLMが黙って落ちるという、非常に原因きり分けが難しい問題があります。

Copilot proはWindowsのイベントログからエラーを確認するという荒業で、この問題を解決させました。

根本原因はコンバーターは処理したと出力しているのに、実際は無変換の領域があり、その無変換領域の容量が大きいためFLMが処理できず、FLMが落ちるという事でした。


対策としてFLMコンバーターに手をいれました。
変更点
コンバーター自体
・ネイティブF32/F16/BF16テンソルが2次元以上かつdefault_tensor_typeがQ4_0/Q4_1/Q8_0を要求している場合、そのままpassthroughせず量子化パイプラインに流すよう分岐を追加。
・1次元テンソル(rope_freqs等)は量子化対象外として除外(configにオーバーライドがない場合のセーフガード)。
・量子化フォールバック処理に、要求フォーマットがBF16の場合は再量子化不要でそのまま返す分岐を追加(既存)。
q4nx/models/gemma4.py
・追加 _quantize_embedding_int8()メソッド(新規、61行目付近)
上記変更により、BF16が正しくq4nxに変換でき、gemma-4-E2B-it-ultra-uncensored-hereticが動作できました。
Q4NX_コンバーターをフォークし、上記問題点を修正したバージョンをブランチしましたので、もしテストしてみたい方は下記リンクよりお試しください。
ちなみにCopilot proの使用率は73%まで使いました。
このコンバーターで約40%使用した形です。
https://github.com/uppiy47g/FLM_Q4NX_Converter/tree/fix/bf16-source-linear-weight-quantization
