From c2f313bb96c7512d071e9deb3932cc44d8b49971 Mon Sep 17 00:00:00 2001 From: ModelHub XC Date: Fri, 8 May 2026 02:05:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=EF=BC=8C=E7=94=B1ModelHub=20XC=E7=A4=BE=E5=8C=BA=E6=8F=90?= =?UTF-8?q?=E4=BE=9B=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Model: FlagRelease/Qwen3-4B-FlagOS-cambricon Source: Original Platform --- .DS_Store | Bin 0 -> 6148 bytes .gitattributes | 51 ++++ README.md | 94 +++++++ added_tokens.json | 28 +++ config.json | 30 +++ configuration.json | 1 + generation_config.json | 13 + image_.jpeg | Bin 0 -> 25748 bytes merges.txt | 3 + model-00001-of-00003.safetensors | 3 + model-00002-of-00003.safetensors | 3 + model-00003-of-00003.safetensors | 3 + model.safetensors.index.json | 405 +++++++++++++++++++++++++++++++ special_tokens_map.json | 31 +++ tokenizer.json | 3 + tokenizer_config.json | 239 ++++++++++++++++++ vocab.json | 3 + 17 files changed, 910 insertions(+) create mode 100644 .DS_Store create mode 100644 .gitattributes create mode 100644 README.md create mode 100644 added_tokens.json create mode 100644 config.json create mode 100644 configuration.json create mode 100644 generation_config.json create mode 100644 image_.jpeg create mode 100644 merges.txt create mode 100644 model-00001-of-00003.safetensors create mode 100644 model-00002-of-00003.safetensors create mode 100644 model-00003-of-00003.safetensors create mode 100644 model.safetensors.index.json create mode 100644 special_tokens_map.json create mode 100644 tokenizer.json create mode 100644 tokenizer_config.json create mode 100644 vocab.json diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..745d4e6a6f58ca25c6fc9938b3baa3c36958f287 GIT binary patch literal 6148 zcmeHKO-lnY5Phi?T6!s-ya@XT+9LV`*3t?>RkY|;x81c=wzjlg)Z6|ef1e4H5{YK_LPwkcj+bPuW{WGXY8^1&~woE!CEf-TDIbkbt{}@WM@xs2Vr)?ryHy> z`^Ly+X3Mxnn|!x$POP&+yqaMS)-u>tQ3jL&W#C%|cxH=~Dh{<(29yD1V8MWV9|Edi z=rMO_KOJoB6@XZz+X`*@J(QflW9Tt=$PtQhsYI7*{1wBvbov7y7kbPcx^x(S`7nNF z<8LU&&d&OQ4TlLGYO4$=1FH<|xNcR>|Mu7S|J5YzDFe#Dzhb}?TisTZOY&#y#^U6x t4XF225sAwkE>dXNqnNRB6z@~5&>x6F3_a!!>7nS4fTckjW#CsC_y9vwai#zO literal 0 HcmV?d00001 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..d2fc868 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,51 @@ +*.7z filter=lfs diff=lfs merge=lfs -text +*.arrow filter=lfs diff=lfs merge=lfs -text +*.bin filter=lfs diff=lfs merge=lfs -text +*.bin.* filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.ftz filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.h5 filter=lfs diff=lfs merge=lfs -text +*.joblib filter=lfs diff=lfs merge=lfs -text +*.lfs.* filter=lfs diff=lfs merge=lfs -text +*.model filter=lfs diff=lfs merge=lfs -text +*.msgpack filter=lfs diff=lfs merge=lfs -text +*.onnx filter=lfs diff=lfs merge=lfs -text +*.ot filter=lfs diff=lfs merge=lfs -text +*.parquet filter=lfs diff=lfs merge=lfs -text +*.pb filter=lfs diff=lfs merge=lfs -text +*.pt filter=lfs diff=lfs merge=lfs -text +*.pth filter=lfs diff=lfs merge=lfs -text +*.rar filter=lfs diff=lfs merge=lfs -text +saved_model/**/* filter=lfs diff=lfs merge=lfs -text +*.tar.* filter=lfs diff=lfs merge=lfs -text +*.tflite filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zstandard filter=lfs diff=lfs merge=lfs -text +*.tfevents* filter=lfs diff=lfs merge=lfs -text +*.db* filter=lfs diff=lfs merge=lfs -text +*.ark* filter=lfs diff=lfs merge=lfs -text +**/*ckpt*data* filter=lfs diff=lfs merge=lfs -text +**/*ckpt*.meta filter=lfs diff=lfs merge=lfs -text +**/*ckpt*.index filter=lfs diff=lfs merge=lfs -text +*.safetensors filter=lfs diff=lfs merge=lfs -text +*.ckpt filter=lfs diff=lfs merge=lfs -text +*.gguf* filter=lfs diff=lfs merge=lfs -text +*.ggml filter=lfs diff=lfs merge=lfs -text +*.llamafile* filter=lfs diff=lfs merge=lfs -text +*.pt2 filter=lfs diff=lfs merge=lfs -text +*.mlmodel filter=lfs diff=lfs merge=lfs -text +*.npy filter=lfs diff=lfs merge=lfs -text +*.npz filter=lfs diff=lfs merge=lfs -text +*.pickle filter=lfs diff=lfs merge=lfs -text +*.pkl filter=lfs diff=lfs merge=lfs -text +*.tar filter=lfs diff=lfs merge=lfs -text +*.wasm filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text +*tfevents* filter=lfs diff=lfs merge=lfs -text + +merges.txt filter=lfs diff=lfs merge=lfs -text +tokenizer.json filter=lfs diff=lfs merge=lfs -text +vocab.json filter=lfs diff=lfs merge=lfs -text \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..fc8b0a4 --- /dev/null +++ b/README.md @@ -0,0 +1,94 @@ +# Introduction + +Qwen3-4B-FlagOS-cambricon provides an all-in-one deployment solution, enabling execution of Qwen3-4B on cambricon GPUs. As the first-generation release for the cambricon-MLU590, this package delivers two key features: + +1. Comprehensive Integration: + - Integrated with FlagScale (https://github.com/FlagOpen/FlagScale). + - Open-source inference execution code, preconfigured with all necessary software and hardware settings. + - Pre-built Docker image for rapid deployment on cambricon-MLU590. +2. Consistency Validation: + - Evaluation tests verifying consistency of results between the official and ours. + +# Technical Summary + +## Serving Engine + +We use FlagScale as the serving engine to improve the portability of distributed inference. + +FlagScale is an end-to-end framework for large models across multiple chips, maximizing computational resource efficiency while ensuring model effectiveness. It ensures both ease of use and high performance for users when deploying models across different chip architectures: + +- One-Click Service Deployment: FlagScale provides a unified and simple command execution mechanism, allowing users to fast deploy services seamlessly across various hardware platforms using the same command. This significantly reduces the entry barrier and enhances user experience. +- Automated Deployment Optimization: FlagScale automatically optimizes distributed parallel strategies based on the computational capabilities of different AI chips, ensuring optimal resource allocation and efficient utilization, thereby improving overall deployment performance. +- Automatic Operator Library Switching: Leveraging FlagScale's unified Runner mechanism and deep integration with FlagGems, users can seamlessly switch to the FlagGems operator library for inference by simply adding environment variables in the configuration file. + +## Triton Support + +We validate the execution of Qwen3-4B model with a Triton-based operator library as a PyTorch alternative. + +We use a variety of Triton-implemented operation kernels to run the Qwen3-4B model. These kernels come from two main sources: + +- Most Triton kernels are provided by FlagGems (https://github.com/FlagOpen/FlagGems). You can enable FlagGems kernels by setting the environment variable USE_FLAGGEMS. + +- Also included are Triton kernels from vLLM, such as fused MoE. + + +# Evaluation Results + +## Benchmark Result + +| Metrics | Qwen3-4B-H100-CUDA | Qwen3-4B-FlagOS-cambricon | +| --------- | ------------------ | ------------------------- | +| LIVEBENCH | 0.501 | 0.527 | +| AIME | 0.700 | 0.733 | +| GPQA | 0.410 | 0.430 | +| MMLU | 0.669 | 0.668 | +| MUSR | 0.590 | 0.620 | +| TheoremQA | 0.077 | 0.085 | + + +# How to Run Locally + +## 📌 Getting Started + +### Download the FlagOS image + +As requested by Cambricon, the Docker image and model files must be requested via email. Please contact ecosystem@cambricon.com and include your organization name, contact person, contact information, equipment source, and specific requirements. + +```bash +docker pull +``` + +### Download open-source weights + +```bash +pip install modelscope +modelscope download --model Qwen/Qwen3-4B --local_dir /share/Qwen3-4B + +``` + +### Start the inference service + +```bash +docker run -d --name flagos -e DISPLAY=$DISPLAY --net=host --pid=host --ipc=host -v /tmp/.X11-unix:/tmp/.X11-unix --privileged -v /share/project/shihonghao/host02:/share -v /home:/home -v /mnt/:/mnt/ -v /data/:/data/ -v /opt/data/:/opt/data/ -v /usr/bin/cnmon:/usr/bin/cnmon sleep infinity + +docker exec -it flagos bash +``` + +### Serve + +```bash +flagscale serve qwen3 +``` + +# Contributing + +We warmly welcome global developers to join us: + +1. Submit Issues to report problems +2. Create Pull Requests to contribute code +3. Improve technical documentation +4. Expand hardware adaptation support + +# License + +本模型的权重来源于Qwen/Qwen3-4B,以apache2.0协议https://www.apache.org/licenses/LICENSE-2.0.txt开源。 \ No newline at end of file diff --git a/added_tokens.json b/added_tokens.json new file mode 100644 index 0000000..b54f913 --- /dev/null +++ b/added_tokens.json @@ -0,0 +1,28 @@ +{ + "": 151668, + "": 151658, + "": 151666, + "": 151667, + "": 151657, + "": 151665, + "<|box_end|>": 151649, + "<|box_start|>": 151648, + "<|endoftext|>": 151643, + "<|file_sep|>": 151664, + "<|fim_middle|>": 151660, + "<|fim_pad|>": 151662, + "<|fim_prefix|>": 151659, + "<|fim_suffix|>": 151661, + "<|im_end|>": 151645, + "<|im_start|>": 151644, + "<|image_pad|>": 151655, + "<|object_ref_end|>": 151647, + "<|object_ref_start|>": 151646, + "<|quad_end|>": 151651, + "<|quad_start|>": 151650, + "<|repo_name|>": 151663, + "<|video_pad|>": 151656, + "<|vision_end|>": 151653, + "<|vision_pad|>": 151654, + "<|vision_start|>": 151652 +} diff --git a/config.json b/config.json new file mode 100644 index 0000000..e49eccd --- /dev/null +++ b/config.json @@ -0,0 +1,30 @@ +{ + "architectures": [ + "Qwen3ForCausalLM" + ], + "attention_bias": false, + "attention_dropout": 0.0, + "bos_token_id": 151643, + "eos_token_id": 151645, + "head_dim": 128, + "hidden_act": "silu", + "hidden_size": 2560, + "initializer_range": 0.02, + "intermediate_size": 9728, + "max_position_embeddings": 40960, + "max_window_layers": 36, + "model_type": "qwen3", + "num_attention_heads": 32, + "num_hidden_layers": 36, + "num_key_value_heads": 8, + "rms_norm_eps": 1e-06, + "rope_scaling": null, + "rope_theta": 1000000, + "sliding_window": null, + "tie_word_embeddings": true, + "torch_dtype": "bfloat16", + "transformers_version": "4.51.0", + "use_cache": true, + "use_sliding_window": false, + "vocab_size": 151936 +} \ No newline at end of file diff --git a/configuration.json b/configuration.json new file mode 100644 index 0000000..f9291c3 --- /dev/null +++ b/configuration.json @@ -0,0 +1 @@ +{"framework":"Pytorch","task":"text-generation"} \ No newline at end of file diff --git a/generation_config.json b/generation_config.json new file mode 100644 index 0000000..20a8a91 --- /dev/null +++ b/generation_config.json @@ -0,0 +1,13 @@ +{ + "bos_token_id": 151643, + "do_sample": true, + "eos_token_id": [ + 151645, + 151643 + ], + "pad_token_id": 151643, + "temperature": 0.6, + "top_k": 20, + "top_p": 0.95, + "transformers_version": "4.51.0" +} \ No newline at end of file diff --git a/image_.jpeg b/image_.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..1969ddd580fa50d1c8c67a08269057ab4d60a955 GIT binary patch literal 25748 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", + "<|im_end|>", + "<|object_ref_start|>", + "<|object_ref_end|>", + "<|box_start|>", + "<|box_end|>", + "<|quad_start|>", + "<|quad_end|>", + "<|vision_start|>", + "<|vision_end|>", + "<|vision_pad|>", + "<|image_pad|>", + "<|video_pad|>" + ], + "eos_token": { + "content": "<|im_end|>", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false + }, + "pad_token": { + "content": "<|endoftext|>", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false + } +} diff --git a/tokenizer.json b/tokenizer.json new file mode 100644 index 0000000..cd71f61 --- /dev/null +++ b/tokenizer.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4 +size 11422654 diff --git a/tokenizer_config.json b/tokenizer_config.json new file mode 100644 index 0000000..68a67c7 --- /dev/null +++ b/tokenizer_config.json @@ -0,0 +1,239 @@ +{ + "add_bos_token": false, + "add_prefix_space": false, + "added_tokens_decoder": { + "151643": { + "content": "<|endoftext|>", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "151644": { + "content": "<|im_start|>", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "151645": { + "content": "<|im_end|>", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "151646": { + "content": "<|object_ref_start|>", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "151647": { + "content": "<|object_ref_end|>", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "151648": { + "content": "<|box_start|>", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "151649": { + "content": "<|box_end|>", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "151650": { + "content": "<|quad_start|>", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "151651": { + "content": "<|quad_end|>", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "151652": { + "content": "<|vision_start|>", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "151653": { + "content": "<|vision_end|>", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "151654": { + "content": "<|vision_pad|>", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "151655": { + "content": "<|image_pad|>", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "151656": { + "content": "<|video_pad|>", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "151657": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": false + }, + "151658": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": false + }, + "151659": { + "content": "<|fim_prefix|>", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": false + }, + "151660": { + "content": "<|fim_middle|>", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": false + }, + "151661": { + "content": "<|fim_suffix|>", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": false + }, + "151662": { + "content": "<|fim_pad|>", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": false + }, + "151663": { + "content": "<|repo_name|>", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": false + }, + "151664": { + "content": "<|file_sep|>", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": false + }, + "151665": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": false + }, + "151666": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": false + }, + "151667": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": false + }, + "151668": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": false + } + }, + "additional_special_tokens": [ + "<|im_start|>", + "<|im_end|>", + "<|object_ref_start|>", + "<|object_ref_end|>", + "<|box_start|>", + "<|box_end|>", + "<|quad_start|>", + "<|quad_end|>", + "<|vision_start|>", + "<|vision_end|>", + "<|vision_pad|>", + "<|image_pad|>", + "<|video_pad|>" + ], + "bos_token": null, + "chat_template": "{%- if tools %}\n {{- '<|im_start|>system\\n' }}\n {%- if messages[0].role == 'system' %}\n {{- messages[0].content + '\\n\\n' }}\n {%- endif %}\n {{- \"# Tools\\n\\nYou may call one or more functions to assist with the user query.\\n\\nYou are provided with function signatures within XML tags:\\n\" }}\n {%- for tool in tools %}\n {{- \"\\n\" }}\n {{- tool | tojson }}\n {%- endfor %}\n {{- \"\\n\\n\\nFor each function call, return a json object with function name and arguments within XML tags:\\n\\n{\\\"name\\\": , \\\"arguments\\\": }\\n<|im_end|>\\n\" }}\n{%- else %}\n {%- if messages[0].role == 'system' %}\n {{- '<|im_start|>system\\n' + messages[0].content + '<|im_end|>\\n' }}\n {%- endif %}\n{%- endif %}\n{%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) %}\n{%- for message in messages[::-1] %}\n {%- set index = (messages|length - 1) - loop.index0 %}\n {%- if ns.multi_step_tool and message.role == \"user\" and not(message.content.startswith('') and message.content.endswith('')) %}\n {%- set ns.multi_step_tool = false %}\n {%- set ns.last_query_index = index %}\n {%- endif %}\n{%- endfor %}\n{%- for message in messages %}\n {%- if (message.role == \"user\") or (message.role == \"system\" and not loop.first) %}\n {{- '<|im_start|>' + message.role + '\\n' + message.content + '<|im_end|>' + '\\n' }}\n {%- elif message.role == \"assistant\" %}\n {%- set content = message.content %}\n {%- set reasoning_content = '' %}\n {%- if message.reasoning_content is defined and message.reasoning_content is not none %}\n {%- set reasoning_content = message.reasoning_content %}\n {%- else %}\n {%- if '' in message.content %}\n {%- set content = message.content.split('')[-1].lstrip('\\n') %}\n {%- set reasoning_content = message.content.split('')[0].rstrip('\\n').split('')[-1].lstrip('\\n') %}\n {%- endif %}\n {%- endif %}\n {%- if loop.index0 > ns.last_query_index %}\n {%- if loop.last or (not loop.last and reasoning_content) %}\n {{- '<|im_start|>' + message.role + '\\n\\n' + reasoning_content.strip('\\n') + '\\n\\n\\n' + content.lstrip('\\n') }}\n {%- else %}\n {{- '<|im_start|>' + message.role + '\\n' + content }}\n {%- endif %}\n {%- else %}\n {{- '<|im_start|>' + message.role + '\\n' + content }}\n {%- endif %}\n {%- if message.tool_calls %}\n {%- for tool_call in message.tool_calls %}\n {%- if (loop.first and content) or (not loop.first) %}\n {{- '\\n' }}\n {%- endif %}\n {%- if tool_call.function %}\n {%- set tool_call = tool_call.function %}\n {%- endif %}\n {{- '\\n{\"name\": \"' }}\n {{- tool_call.name }}\n {{- '\", \"arguments\": ' }}\n {%- if tool_call.arguments is string %}\n {{- tool_call.arguments }}\n {%- else %}\n {{- tool_call.arguments | tojson }}\n {%- endif %}\n {{- '}\\n' }}\n {%- endfor %}\n {%- endif %}\n {{- '<|im_end|>\\n' }}\n {%- elif message.role == \"tool\" %}\n {%- if loop.first or (messages[loop.index0 - 1].role != \"tool\") %}\n {{- '<|im_start|>user' }}\n {%- endif %}\n {{- '\\n\\n' }}\n {{- message.content }}\n {{- '\\n' }}\n {%- if loop.last or (messages[loop.index0 + 1].role != \"tool\") %}\n {{- '<|im_end|>\\n' }}\n {%- endif %}\n {%- endif %}\n{%- endfor %}\n{%- if add_generation_prompt %}\n {{- '<|im_start|>assistant\\n' }}\n {%- if enable_thinking is defined and enable_thinking is false %}\n {{- '\\n\\n\\n\\n' }}\n {%- endif %}\n{%- endif %}", + "clean_up_tokenization_spaces": false, + "eos_token": "<|im_end|>", + "errors": "replace", + "model_max_length": 131072, + "pad_token": "<|endoftext|>", + "split_special_tokens": false, + "tokenizer_class": "Qwen2Tokenizer", + "unk_token": null +} \ No newline at end of file diff --git a/vocab.json b/vocab.json new file mode 100644 index 0000000..6c49fc6 --- /dev/null +++ b/vocab.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910 +size 2776833