[開発者向け]Qwen3.8-27Bを動かす——画像・動画・思考制御・100万トークン対応

目次

はじめに

 Qwenチームが2026年8月、画像・動画理解と長時間エージェント処理に対応するオープンモデル「Qwen3.8-27B」を公開しました。本稿では、モデル仕様と評価値に加え、Transformers、vLLM、SGLang、OpenAI互換APIで試す手順を整理します。

参考記事

関連記事

あわせて読みたい
[開発者向け]AlibabaがQwen3.6-35B-A3Bをオープンウェイトで公開——エージェントコーディングと思考保... はじめに  AlibabaのQwenチームが2026年4月、コーディング能力を大幅に強化したマルチモーダルLLM「Qwen3.6-35B-A3B」をオープンウェイトで公開しました。2月リリース...
あわせて読みたい
[ニュース解説]GitHub星数14万超の自己進化型エージェント「Hermes」——NVIDIA RTXとQwen 3.6でローカ... はじめに  NVIDIAが2026年5月22日、Nous Researchが開発した自己進化型AIエージェント「Hermes Agent」と、NVIDIA製ハードウェアとの組み合わせについて公式ブログで解...

要点

  • Qwen3.8-27Bは27BパラメータのdenseなVision-Language Modelで、Apache 2.0ライセンスで公開されている
  • context lengthは262,144トークンで、YaRN設定により最大100万トークンへ拡張できる
  • 推論は既定で有効で、reasoning_effortとpreserve_thinkingにより深さと履歴保持を調整できる
  • Transformers、vLLM、SGLang、OpenAI互換APIなど複数の実行経路が用意されている
  • Qwenの評価ではTerminal Bench 2.1が73.0、SWE-bench Proが61.7、OSWorld-Verifiedが84.3である

詳細解説

モデル仕様と利用前の確認

 Qwen3.8-27Bは、Vision Encoderを持つcausal language modelです。言語部は27Bパラメータ、hidden dimensionは5,120、64層で、Gated DeltaNetとGated Attentionを組み合わせています。画像と動画をネイティブに扱い、文書、STEM図、長時間動画、コンピューター操作を含む用途を想定しています。重みはSafetensors形式で、モデルカードのライセンスはApache 2.0です。

 ローカル実行では、27BのBF16重みだけでも大きなGPUメモリが必要です。量子化版、複数GPU、offloadの条件によって必要量が変わるため、導入前にGPUメモリ、CUDA、PyTorch、推論frameworkの対応版を確認します。Hugging Faceは、productionや高throughputでは最新のSGLang、vLLM、TokenSpeedなど専用engineを推奨しています。

Transformersで画像を試す

 まずPythonとpip(Pythonのpackage管理tool)のversionを確認し、仮想環境を用意します。仮想環境は、他projectとdependency versionが衝突するのを避けるために使います。

Pythonとpipのversionを確認します

python --version
pip --version

 Hugging Faceのpipelineを使う最小例です。初回はmodel weightのdownloadが発生します。

高水準のpipeline APIを読み込みます

from transformers import pipeline

画像と文章を扱うpipelineをmodel IDから作成します

pipe = pipeline("image-text-to-text", model="Qwen/Qwen3.8-27B")

user messageへ画像URLと質問を含めます

messages = [
    {
        "role": "user",
        "content": [
            {
                "type": "image",
                "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG",
            },
            {"type": "text", "text": "What animal is on the candy?"},
        ],
    },
]

pipelineへmessageを渡します

result = pipe(text=messages)

print(result)

 processorとmodelを直接読み込む場合は、次のように生成範囲を明示できます。device_map=”auto”は利用可能なdeviceへ配置を割り当てます。

from transformers import AutoProcessor, AutoModelForMultimodalLM

tokenizerと画像processorを読み込みます

processor = AutoProcessor.from_pretrained("Qwen/Qwen3.8-27B")

modelを読み込み、利用可能なdeviceへ自動配置します

model = AutoModelForMultimodalLM.from_pretrained(
    "Qwen/Qwen3.8-27B",
    device_map="auto",
)

messages = [
    {
        "role": "user",
        "content": [
            {
                "type": "image",
                "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG",
            },
            {"type": "text", "text": "What animal is on the candy?"},
        ],
    },
]

chat templateをtensorへ変換します

inputs = processor.apply_chat_template(
    messages,
    add_generation_prompt=True,
    tokenize=True,
    return_dict=True,
    return_tensors="pt",
).to(model.device)

最大40tokenを生成し、入力部分を除いてdecodeします

outputs = model.generate(**inputs, max_new_tokens=40)

answer = processor.decode(outputs[0][inputs["input_ids"].shape[-1]:])

print(answer)

vLLMとSGLangでAPI serverを起動する

 vLLMではpackageをinstallし、model IDを指定してOpenAI互換serverを起動します。

vLLMをinstallします

pip install vllm

port 8000でQwen3.8-27Bを配信します

vllm serve "Qwen/Qwen3.8-27B"

 起動後はChat Completions互換endpointを呼び出せます。

curl -X POST "http://localhost:8000/v1/chat/completions" \
  -H "Content-Type: application/json" \
  --data '{
    "model": "Qwen/Qwen3.8-27B",
    "messages": [
      {
        "role": "user",
        "content": [
          {"type": "text", "text": "Describe this image in one sentence."},
          {
            "type": "image_url",
            "image_url": {
              "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg"
            }
          }
        ]
      }
    ]
  }'

 SGLangを使う場合はport 30000でserverを起動します。

SGLangをinstallします

pip install sglang

model pathとlisten addressを指定してserverを起動します

python3 -m sglang.launch_server \
  --model-path "Qwen/Qwen3.8-27B" \
  --host 0.0.0.0 \
  --port 30000

 Dockerを使う場合はshared memoryとGPUを明示します。HF_TOKENは実際のtokenを会話やlogへ出さず、環境変数として設定します。

docker run --gpus all \
  --shm-size 32g \
  -p 30000:30000 \
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  --env "HF_TOKEN=<secret>" \
  --ipc=host \
  lmsysorg/sglang:latest \
  python3 -m sglang.launch_server \
    --model-path "Qwen/Qwen3.8-27B" \
    --host 0.0.0.0 \
    --port 30000

 注意: localhost以外へ公開する場合は、認証、TLS、rate limit、request size制限を別途設けます。model serverをそのままinternetへ公開しないことが重要です。

reasoning_effortと思考履歴を調整する

 Qwen3.8-27Bはthinking modeが既定で有効です。reasoning_effortはxhigh、medium、lowに対応します。低い設定は1turnを速くできますが、分析不足からretryが増え、task全体の時間やtokenが増える場合があるとQwenは説明しています。

from openai import OpenAI

OPENAI_BASE_URLとOPENAI_API_KEYを環境変数から読みます

client = OpenAI()

messages = [

    {

        "role": "user",

        "content": "Write a Python function to merge two sorted linked lists.",

    }

]

thinkingを保持し、xhighでstreaming実行します

completion = client.chat.completions.create(

    model=”Qwen/Qwen3.8-27B”,

    messages=messages,

    extra_body={

        “chat_template_kwargs”: {

            “enable_thinking”: True,

            “preserve_thinking”: True,

        },

    },

    reasoning_effort=”xhigh”,

    stream=True,

    stream_options={“include_usage”: True},

)

for chunk in completion:

    if chunk.choices and chunk.choices[0].delta.content:

        print(chunk.choices[0].delta.content, end=””, flush=True)

 thinkingを無効にする場合はsampling parameterもnon-thinking向けに調整します。

chat_response = client.chat.completions.create(

    model=”Qwen/Qwen3.8-27B”,

    messages=messages,

    temperature=0.7,

    top_p=0.8,

    presence_penalty=1.5,

    extra_body={

        “top_k”: 20,

        “chat_template_kwargs”: {“enable_thinking”: False},

    },

)

print(chat_response)

 preserve_thinkingは過去messageのthinking blockを保持し、agent taskの判断一貫性とKV cache利用を高める設定です。最新のuser messageだけに限定したい場合はFalseへ変更します。

chat_response = client.chat.completions.create(

    model=”Qwen/Qwen3.8-27B”,

    messages=messages,

    extra_body={

        “chat_template_kwargs”: {“preserve_thinking”: False},

    },

)

262,144から100万トークンへ拡張する

 native contextは262,144トークンです。これを超える用途ではYaRNによるRoPE scalingを利用できます。config.jsonのtext_config.rope_parametersを次のように設定します。

{

  "mrope_interleaved": true,

  "mrope_section": [11, 11, 10],

  "rope_type": "yarn",

  "rope_theta": 10000000,

  "partial_rotary_factor": 0.25,

  "factor": 4.0,

  "original_max_position_embeddings": 262144

}

 vLLMの起動時に上書きする例です。

VLLM_ALLOW_LONG_MAX_MODEL_LEN=1 vllm serve "Qwen/Qwen3.8-27B" \

  --hf-overrides '{"text_config":{"rope_parameters":{"mrope_interleaved":true,"mrope_section":[11,11,10],"rope_type":"yarn","rope_theta":10000000,"partial_rotary_factor":0.25,"factor":4.0,"original_max_position_embeddings":262144}}}' \

  --max-model-len 1000000

 static YaRNは短い入力でも同じscaling factorを使うため、短文性能へ影響する可能性があります。典型的なcontextが524,288ならfactor 2.0を検討するなど、必要な長さに合わせて設定します。最大長へ広げるほどKV cacheのmemoryも増えるため、GPU構成と同時に評価する必要があります。

ベンチマークを導入判断へ使う

 Qwenのmodel cardでは、Terminal Bench 2.1が73.0、SWE-bench Proが61.7、QwenSWEBenchが79.0、CoWorkBenchが70.7と報告されています。視覚系ではOSWorld-Verifiedが84.3、WebArena-Verifiedが64.8、AndroidWorldが81.9、Vision2Webが62.9です。27Bのopen modelとして、coding、computer use、長時間taskを一つのmodelで扱える点が特徴です。

 ただし評価にはClaude Code harness、Qwen独自benchmark、修正済みdata、特定のtemperatureやcontext長が使われています。数字だけでproduction採用を決めず、自社taskで精度、latency、GPU memory、retry率、出力の安全性を測ります。特にreasoning_effortごとのtask完了率と総token数を合わせて比較することが重要だと思います。

まとめ

 Qwen3.8-27Bは、27Bのdense modelで画像・動画、agent coding、思考制御、長いcontextを一つにまとめています。まずTransformersかOpenAI互換APIで小さく確認し、productionではvLLMやSGLangの認証、GPU memory、長文設定を含めて評価する進め方が適切だと思います。

この記事が気に入ったら
フォローしてね!

  • URLをコピーしました!
  • URLをコピーしました!
目次