模型概述
模型特點
模型能力
使用案例
🚀 360Zhinao (360智腦)
360智腦是奇虎360推出的模型系列,包含基礎模型與不同上下文長度的對話模型。該模型基於高質量語料預訓練,在多項基準測試中表現出色,具備強大的語言理解、知識問答、代碼生成等能力,為自然語言處理任務提供了有力支持。
歡迎訪問 360 智腦的官方網站 https://ai.360.com 進行更多體驗。
🚀 快速開始
依賴安裝
- python >= 3.8
- pytorch >= 2.0
- transformers >= 4.37.2
- CUDA >= 11.4
pip install -r requirements.txt
可選地,建議安裝 Flash-Attention 2 以提高性能並減少內存佔用。
flash-attn >= 2.3.6
FLASH_ATTENTION_FORCE_BUILD=TRUE pip install flash-attn==2.3.6
🤗 Transformers
基礎模型推理示例
from transformers import AutoTokenizer, AutoModelForCausalLM
from transformers.generation import GenerationConfig
MODEL_NAME_OR_PATH = "qihoo360/360Zhinao-7B-Base"
tokenizer = AutoTokenizer.from_pretrained(
MODEL_NAME_OR_PATH,
trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
MODEL_NAME_OR_PATH,
device_map="auto",
trust_remote_code=True)
generation_config = GenerationConfig.from_pretrained(
MODEL_NAME_OR_PATH,
trust_remote_code=True)
inputs = tokenizer('中國二十四節氣\n1. 立春\n2. 雨水\n3. 驚蟄\n4. 春分\n5. 清明\n', return_tensors='pt')
inputs = inputs.to(model.device)
pred = model.generate(input_ids=inputs["input_ids"], generation_config=generation_config)
print("outputs:\n", tokenizer.decode(pred.cpu()[0], skip_special_tokens=True))
對話模型推理示例
from transformers import AutoTokenizer, AutoModelForCausalLM
from transformers.generation import GenerationConfig
MODEL_NAME_OR_PATH = "qihoo360/360Zhinao-7B-Chat-4K"
tokenizer = AutoTokenizer.from_pretrained(
MODEL_NAME_OR_PATH,
trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
MODEL_NAME_OR_PATH,
device_map="auto",
trust_remote_code=True)
generation_config = GenerationConfig.from_pretrained(
MODEL_NAME_OR_PATH,
trust_remote_code=True)
messages = []
#round-1
messages.append({"role": "user", "content": "介紹一下劉德華"})
response = model.chat(tokenizer=tokenizer, messages=messages, generation_config=generation_config)
messages.append({"role": "assistant", "content": response})
print(messages)
#round-2
messages.append({"role": "user", "content": "他有什麼代表作?"})
response = model.chat(tokenizer=tokenizer, messages=messages, generation_config=generation_config)
messages.append({"role": "assistant", "content": response})
print(messages)
🤖 ModelScope
基礎模型推理示例
from modelscope import AutoModelForCausalLM, AutoTokenizer
from modelscope import GenerationConfig
MODEL_NAME_OR_PATH = "qihoo360/360Zhinao-7B-Base"
tokenizer = AutoTokenizer.from_pretrained(
MODEL_NAME_OR_PATH,
trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
MODEL_NAME_OR_PATH,
device_map="auto",
trust_remote_code=True)
generation_config = GenerationConfig.from_pretrained(
MODEL_NAME_OR_PATH,
trust_remote_code=True)
inputs = tokenizer('中國二十四節氣\n1. 立春\n2. 雨水\n3. 驚蟄\n4. 春分\n5. 清明\n', return_tensors='pt')
inputs = inputs.to(model.device)
pred = model.generate(input_ids=inputs["input_ids"], generation_config=generation_config)
print("outputs:\n", tokenizer.decode(pred.cpu()[0], skip_special_tokens=True))
對話模型推理示例
from modelscope import AutoModelForCausalLM, AutoTokenizer
from modelscope import GenerationConfig
MODEL_NAME_OR_PATH = "qihoo360/360Zhinao-7B-Chat-4K"
tokenizer = AutoTokenizer.from_pretrained(
MODEL_NAME_OR_PATH,
trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
MODEL_NAME_OR_PATH,
device_map="auto",
trust_remote_code=True)
generation_config = GenerationConfig.from_pretrained(
MODEL_NAME_OR_PATH,
trust_remote_code=True)
messages = []
#round-1
messages.append({"role": "user", "content": "介紹一下劉德華"})
response = model.chat(tokenizer=tokenizer, messages=messages, generation_config=generation_config)
messages.append({"role": "assistant", "content": response})
print(messages)
#round-2
messages.append({"role": "user", "content": "他有什麼代表作?"})
response = model.chat(tokenizer=tokenizer, messages=messages, generation_config=generation_config)
messages.append({"role": "assistant", "content": response})
print(messages)
CLI 演示
使用終端進行命令行界面操作:
python cli_demo.py
Web 演示
streamlit run web_demo.py
API 演示
啟動 API:
python openai_api.py
然後使用參數進行請求:
curl 'http://localhost:8360/v1/chat/completions' \
-H 'Content-Type: application/json' \
-d '{
"max_new_tokens": 200,
"do_sample": true,
"top_k": 0,
"top_p": 0.8,
"temperature": 1.0,
"repetition_penalty": 1.0,
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "你好"}
]
}'
✨ 主要特性
- 模型系列豐富:發佈了 360Zhinao-7B-Base、360Zhinao-7B-Chat-4K、360Zhinao-7B-Chat-32K 和 360Zhinao-7B-Chat-360K 等模型。
- 基礎模型性能出色:基於 3.4 萬億高質量語料(主要包含中文、英文和代碼)預訓練,在多項基準測試中表現優於其他 7B 模型。
- 對話模型能力強大:具備強大的對話能力,擁有 4K、32K 和 360K 三種上下文長度,其中 360K(約 500k 漢字)是 2024 年 4 月 11 日發佈時中文開源模型中最長的上下文長度。
📦 安裝指南
依賴安裝
- python >= 3.8
- pytorch >= 2.0
- transformers >= 4.37.2
- CUDA >= 11.4
pip install -r requirements.txt
可選地,建議安裝 Flash-Attention 2 以提高性能並減少內存佔用。
flash-attn >= 2.3.6
FLASH_ATTENTION_FORCE_BUILD=TRUE pip install flash-attn==2.3.6
vLLM 安裝
推薦使用 vLLM==0.3.3
。
如果使用 CUDA 12.1 和 PyTorch 2.1,可以直接安裝 vLLM:
pip install vllm==0.3.3
否則,請參考官方 vLLM 安裝說明。
安裝後,執行以下步驟:
- 將
vllm/zhinao.py
複製到 vllm 安裝目錄(python/conda 環境)的vllm/model_executor/models
中。 - 將
vllm/serving_chat.py
複製到 vllm 安裝目錄的vllm/entrypoints/openai
中。 - 然後在
vllm/model_executor/models/__init__.py
中添加一行:
"ZhinaoForCausalLM": ("zhinao", "ZhinaoForCausalLM"),
💻 使用示例
基礎用法
以 360Zhinao-7B-Base 模型在 🤗 Transformers 中的推理為例:
from transformers import AutoTokenizer, AutoModelForCausalLM
from transformers.generation import GenerationConfig
MODEL_NAME_OR_PATH = "qihoo360/360Zhinao-7B-Base"
tokenizer = AutoTokenizer.from_pretrained(
MODEL_NAME_OR_PATH,
trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
MODEL_NAME_OR_PATH,
device_map="auto",
trust_remote_code=True)
generation_config = GenerationConfig.from_pretrained(
MODEL_NAME_OR_PATH,
trust_remote_code=True)
inputs = tokenizer('中國二十四節氣\n1. 立春\n2. 雨水\n3. 驚蟄\n4. 春分\n5. 清明\n', return_tensors='pt')
inputs = inputs.to(model.device)
pred = model.generate(input_ids=inputs["input_ids"], generation_config=generation_config)
print("outputs:\n", tokenizer.decode(pred.cpu()[0], skip_special_tokens=True))
高級用法
以 360Zhinao-7B-Chat-4K 模型在 🤗 Transformers 中的多輪對話推理為例:
from transformers import AutoTokenizer, AutoModelForCausalLM
from transformers.generation import GenerationConfig
MODEL_NAME_OR_PATH = "qihoo360/360Zhinao-7B-Chat-4K"
tokenizer = AutoTokenizer.from_pretrained(
MODEL_NAME_OR_PATH,
trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
MODEL_NAME_OR_PATH,
device_map="auto",
trust_remote_code=True)
generation_config = GenerationConfig.from_pretrained(
MODEL_NAME_OR_PATH,
trust_remote_code=True)
messages = []
#round-1
messages.append({"role": "user", "content": "介紹一下劉德華"})
response = model.chat(tokenizer=tokenizer, messages=messages, generation_config=generation_config)
messages.append({"role": "assistant", "content": response})
print(messages)
#round-2
messages.append({"role": "user", "content": "他有什麼代表作?"})
response = model.chat(tokenizer=tokenizer, messages=messages, generation_config=generation_config)
messages.append({"role": "assistant", "content": response})
print(messages)
📚 詳細文檔
模型評估
基礎模型
在 OpenCompass 上對模型進行評估,具體包括 C-Eval、AGIEval、MMLU、CMMLU、HellaSwag、MATH、GSM8K、HumanEval、MBPP、BBH 和 LAMBADA 等基準測試,這些測試涵蓋自然語言理解、知識、數學、代碼生成和邏輯推理等方面。
結果如下,可在 OpenCompass 排行榜 上查看或復現:
模型 |
平均得分 | C-Eval | AGIEval | MMLU | CMMLU | HellaSwag | MATH | GSM8K | HumanEval | MBPP | BBH | LAMBADA |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Baichuan2-7B | 41.49 | 56.3 | 34.6 | 54.7 | 57 | 67 | 5.4 | 24.6 | 17.7 | 24 | 41.8 | 73.3 |
Baichuan-7B | 31.94 | 44.7 | 24.6 | 41.5 | 44.6 | 68.4 | 2.5 | 9.6 | 9.1 | 6.4 | 32.8 | 67.1 |
ChatGLM3-6B | 58.67 | 67 | 47.4 | 62.8 | 66.5 | 76.5 | 19.2 | 61 | 44.5 | 57.2 | 66.2 | 77.1 |
DeepSeek-7B | 39.8 | 45 | 24 | 49.3 | 46.8 | 73.4 | 4.2 | 18.3 | 25 | 36.4 | 42.8 | 72.6 |
InternLM2-7B | 58.01 | 65.7 | 50.2 | 65.5 | 66.2 | 79.6 | 19.9 | 70.6 | 41.5 | 42.4 | 64.4 | 72.1 |
InternLM-7B | 39.33 | 53.4 | 36.9 | 51 | 51.8 | 70.6 | 6.3 | 31.2 | 13.4 | 14 | 37 | 67 |
LLaMA-2-7B | 33.27 | 32.5 | 21.8 | 46.8 | 31.8 | 74 | 3.3 | 16.7 | 12.8 | 14.8 | 38.2 | 73.3 |
LLaMA-7B | 30.35 | 27.3 | 20.6 | 35.6 | 26.8 | 74.3 | 2.9 | 10 | 12.8 | 16.8 | 33.5 | 73.3 |
Mistral-7B-v0.1 | 47.67 | 47.4 | 32.8 | 64.1 | 44.7 | 78.9 | 11.3 | 47.5 | 27.4 | 38.6 | 56.7 | 75 |
MPT-7B | 30.06 | 23.5 | 21.3 | 27.5 | 25.9 | 75 | 2.9 | 9.1 | 17.1 | 22.8 | 35.6 | 70 |
Qwen1.5-7B | 55.12 | 73.57 | 50.8 | 62.15 | 71.84 | 72.62 | 20.36 | 54.36 | 53.05 | 36.8 | 40.01 | 70.74 |
Qwen-7B | 49.53 | 63.4 | 45.3 | 59.7 | 62.5 | 75 | 13.3 | 54.1 | 27.4 | 31.4 | 45.2 | 67.5 |
XVERSE-7B | 34.27 | 61.1 | 39 | 58.4 | 60.8 | 73.7 | 2.2 | 11.7 | 4.9 | 10.2 | 31 | 24 |
Yi-6B | 47.8 | 73 | 44.3 | 64 | 73.5 | 73.1 | 6.3 | 39.9 | 15.2 | 23.6 | 44.9 | 68 |
360Zhinao-7B | 56.15 | 74.11 | 49.49 | 67.44 | 72.38 | 83.05 | 16.38 | 53.83 | 35.98 | 42.4 | 43.95 | 78.59 |
對話模型
4K 和 32K 模型使用相同的 4K SFT 數據分別訓練。 對於長上下文模型的訓練,採用兩階段方法: 第一階段:增加 RoPE 基數,將上下文長度擴展到 32K。
- 首先,在約 50 億標記的 32K 上下文窗口上進行持續預訓練。
- 然後在 SFT 階段,使用來自各種來源的長數據(包括高質量人工標註的 32K 數據)對模型進行微調。 第二階段:將上下文長度擴展到 360K,使用以下數據進行訓練:
- 少量高質量人工標註的超長數據。
- 由於標註的超長數據稀缺,構建了各種形式的合成數據。
- 多文檔問答:類似於 Ziya-Reader,基於 360 的數據庫生成多文檔問答對。為一行多文檔問答數據輸入構建多個問答對,形成多輪格式,顯著提高訓練效率。
- 單文檔問答:類似於 LLama2 Long,基於一行長文本輸入的不同片段構建多輪問答數據。
在不同長度和基準測試中對模型進行評估:
- 長上下文基準測試:在 LongBench(一個多任務雙語長上下文基準測試)上對 32K 和 360K 模型進行評估。報告與下游應用最相關的 中文 任務結果:單/多文檔問答、摘要生成、少樣本學習和代碼補全。 | 模型 | 平均得分 | 單文檔問答 | 多文檔問答 | 摘要生成 | 少樣本學習 | 代碼補全 | | :------------------------ |:---------:|:--------:|:---------:|:---------:|:------------:|:---------:| | GPT-3.5-Turbo-16k | 37.84 | 61.2 | 28.7 | 16 | 29.2 | 54.1 | | ChatGLM2-6B-32k | 37.16 | 51.6 | 37.6 | 16.2 | 27.7 | 52.7 | | ChatGLM3-6B-32k | 44.62 | 62.3 | 44.8 | 17.8 | 42 | 56.2 | | InternLM2-Chat-7B | 42.20 | 56.65 | 29.15 | 17.99 | 43.5 | 63.72 | | Qwen1.5-Chat-7B | 36.75 | 52.85 | 30.08 | 14.28 | 32 | 54.55 | | Qwen1.5-Chat-14B | 39.80 | 60.39 | 27.99 | 14.77 | 37 | 58.87 | | 360Zhinao-7B-Chat-32K | 45.18 | 57.18 | 48.06 | 15.03 | 44 | 61.64 |
- 360Zhinao-7B-Chat-360K 在 "NeedleInAHaystack" 上的表現:NeedleInAHaystack 將一小段信息放置在長文本的不同位置,並查詢該信息,以測試大語言模型的長上下文能力。360Zhinao-7B-Chat-360K 在英文和中文的 NeedleInAHaystack 任務上均可達到超過 98% 的準確率。
模型推理
量化
提供基於 AutoGPTQ 的量化方案,併發布 Int4 量化模型。
部署
推薦使用 vLLM==0.3.3
進行部署,具體安裝和啟動步驟見上文安裝指南部分。
模型微調
訓練數據
訓練數據:data/training_data_sample.json
。此示例數據從 multiturn_chat_0.8M 中採樣 10000 行並轉換格式得到。
數據格式:
[
{
"id": 1,
"conversations": [
{
"from": "system",
"value": "You are a helpful assistant."
},
{
"from": "user",
"value": "您好啊"
},
{
"from": "assistant",
"value": "你好!我今天能為您做些什麼?有什麼問題或需要幫助嗎? 我在這裡為您提供服務。"
}
]
}
]
微調腳本
set -x
HOSTFILE=hostfile
DS_CONFIG=./finetune/ds_config_zero2.json
# PARAMS
LR=5e-6
EPOCHS=3
MAX_LEN=4096
BATCH_SIZE=4
NUM_NODES=1
NUM_GPUS=8
MASTER_PORT=29500
IS_CONCAT=False # Whether to concatenate to maximum length (MAX_LEN)
DATA_PATH="./data/training_data_sample.json"
MODEL_PATH="qihoo360/360Zhinao-7B-Base"
OUTPUT_DIR="./outputs/"
deepspeed --hostfile ${HOSTFILE} \
--master_port ${MASTER_PORT} \
--num_nodes ${NUM_NODES} \
--num_gpus ${NUM_GPUS} \
finetune.py \
--report_to "tensorboard" \
--data_path ${DATA_PATH} \
--model_name_or_path ${MODEL_PATH} \
--output_dir ${OUTPUT_DIR} \
--model_max_length ${MAX_LEN} \
--num_train_epochs ${EPOCHS} \
--per_device_train_batch_size ${BATCH_SIZE} \
--gradient_accumulation_steps 1 \
--save_strategy steps \
--save_steps 200 \
--learning_rate ${LR} \
--lr_scheduler_type cosine \
--adam_beta1 0.9 \
--adam_beta2 0.95 \
--adam_epsilon 1e-8 \
--max_grad_norm 1.0 \
--weight_decay 0.1 \
--warmup_ratio 0.01 \
--gradient_checkpointing True \
--bf16 True \
--tf32 True \
--deepspeed ${DS_CONFIG} \
--is_concat ${IS_CONCAT} \
--logging_steps 1 \
--log_on_each_node False
bash finetune/ds_finetune.sh
- 配置
HOSTFILE
可在單機和多機訓練之間切換。 - 配置
ds_config
可在 zero1、zero2 和 zero3 之間切換。 fp16, bf16
可配置混合精度訓練,建議使用 bf16 以與預訓練模型保持一致。is_concat
配置訓練數據是否拼接。
🔧 技術細節
對話模型訓練
4K 和 32K 模型使用相同的 4K SFT 數據分別訓練。對於長上下文模型的訓練,採用兩階段方法:
- 第一階段:增加 RoPE 基數,將上下文長度擴展到 32K。首先在約 50 億標記的 32K 上下文窗口上進行持續預訓練,然後在 SFT 階段使用來自各種來源的長數據(包括高質量人工標註的 32K 數據)對模型進行微調。
- 第二階段:將上下文長度擴展到 360K,使用少量高質量人工標註的超長數據和構建的各種形式的合成數據進行訓練。合成數據包括多文檔問答和單文檔問答,分別借鑑了 Ziya-Reader 和 LLama2 Long 的方法,提高了訓練效率。
模型推理量化
提供基於 AutoGPTQ 的量化方案,併發布 Int4 量化模型,以減少模型的內存佔用和推理時間。
模型部署
推薦使用 vLLM==0.3.3
進行部署,通過複製特定文件和修改配置文件,實現模型的高效推理服務。
模型微調
使用 deepspeed
進行模型微調,通過配置不同的參數,如學習率、訓練輪數、批量大小等,實現模型的高效訓練。同時,可通過配置 HOSTFILE
、ds_config
、fp16, bf16
和 is_concat
等參數,實現單機/多機訓練、不同的優化策略、混合精度訓練和訓練數據的拼接。
📄 許可證
本倉庫的源代碼遵循開源許可證 Apache 2.0。360 智腦開源模型支持商業使用。如果您希望將這些模型用於商業目的或繼續訓練,請通過電子郵件(g-zhinao-opensource@360.cn)聯繫我們進行申請。具體許可協議請見 <<360 智腦開源模型許可證>>。



