模型简介
模型特点
模型能力
使用案例
🚀 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 智脑开源模型许可证>>。



