BAAI
/

AquilaChat-7B / README.md
shunxing1234's picture
Update README.md
25f71f1
|
raw
history blame
9.27 kB
metadata
license: other

Aquila_logo

悟道·天鹰(Aquila)

悟道·天鹰(Aquila) 语言大模型是首个具备中英双语知识、支持商用许可协议、国内数据合规需求的开源语言大模型。

  • 🌟 支持开源商用许可。Aquila系列模型的源代码基于 Apache 2.0 协议,模型权重基于《智源Aquila系列模型许可协议》,使用者在满足许可限制的情况下,可用于商业目的。
  • ✍️ 具备中英文知识。Aquila系列模型在中英文高质量语料基础上从 0 开始训练,中文语料约占 40%,保证模型在预训练阶段就开始积累原生的中文世界知识,而非翻译而来的知识。
  • 👮‍♀️符合国内数据合规需求。Aquila系列模型的中文语料来自智源多年积累的中文数据集,包括来自1万多个站源的中文互联网数据(其中99%以上为国内站源),以及获得国内权威机构支持的高质量中文文献数据、中文书籍数据等。我们仍在持续积累高质量、多样化的数据集,并源源不断加入Aquila基础模型后续训练中。
  • 🎯持续迭代,持续开源开放。我们将不断完善训练数据、优化训练方法、提升模型性能,在更优秀的基础模型基座上,培育枝繁叶茂的“模型树”,持续开源开放更新的版本。

悟道 · 天鹰 Aquila 模型的更多细节将在官方技术报告中呈现。请关注官方渠道更新。包括 FlagAI GitHub仓库FlagAI 知乎账号FlagAI 官方技术交流群、智源研究院微信公众号、智源社区微信公众号。

模型 模型类型 简介 状态 训练所用显卡
Aquila-7B 基础模型,70亿参数 Aquila 基础模型在技术上继承了 GPT-3、LLaMA 等的架构设计优点,替换了一批更高效的底层算子实现、重新设计实现了中英双语的 tokenizer,升级了 BMTrain 并行训练方法,实现了比 Magtron+DeepSpeed ZeRO-2 将近8倍的训练效率。 已发布 Nvidia-A100
Aquila-33B 基础模型,330亿参数 同上 敬请期待 Nvidia-A100
AquilaChat-7B SFT model,基于 Aquila-7B 进行微调和强化学习 AquilaChat 对话模型支持流畅的文本对话及多种语言类生成任务,通过定义可扩展的特殊指令规范,实现 AquilaChat对其它模型和工具的调用,且易于扩展。

例如,调用智源开源的 AltDiffusion 多语言文图生成模型,实现了流畅的文图生成能力。配合智源 InstructFace 多步可控文生图模型,轻松实现对人脸图像的多步可控编辑。
已发布 Nvidia-A100
AquilaChat-33B SFT model,基于 Aquila-33B 进行微调和强化学习 同上 —— 敬请期待
AquilaCode-7B-NV 基础模型,“文本-代码”生成模型,基于 Aquila-7B继续预训练,在英伟达芯片完成训练 AquilaCode-7B 以小数据集、小参数量,实现高性能,是目前支持中英双语的、性能最好的开源代码模型,经过了高质量过滤、使用有合规开源许可的训练代码数据进行训练。

AquilaCode-7B 分别在英伟达和国产芯片上完成了代码模型的训练。
github已发布 Nvidia-A100
AquilaCode-7B-TS 基础模型,“文本-代码”生成模型,基于 Aquila-7B继续预训练,在天数智芯芯片上完成训练 同上 github已发布 Tianshu-BI-V100

悟道·天鹰Aquila系列模型将持续开源更优版本。详情见:**变更日志** 。

快速开始使用 AquilaChat-7B 对话模型

使用方式/How to use

1. 推理/Inference

from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
from cyg_conversation import covert_prompt_to_input_ids_with_history

tokenizer = AutoTokenizer.from_pretrained("BAAI/AquilaChat-7B")
model = AutoModelForCausalLM.from_pretrained("BAAI/AquilaChat-7B")
model.eval()
model.to("cuda:0")
vocab = tokenizer.vocab
print(len(vocab))

text = "请给出10个要到北京旅游的理由。"

tokens = covert_prompt_to_input_ids_with_history(text, history=[], tokenizer=tokenizer, max_token=512)

tokens = torch.tensor(tokens)[None,].to("cuda:0")


with torch.no_grad():
    out = model.generate(tokens, do_sample=True, max_length=512, eos_token_id=100007)[0]

    out = tokenizer.decode(out.cpu().numpy().tolist())

    print(out)

利用NBCE进行推理

import json
import torch
from transformers import AutoTokenizer
from transformers import AutoModelForCausalLM
from transformers import TopPLogitsWarper, LogitsProcessorList
import pdb

# 加载tokenizer
tokenizer = AutoTokenizer.from_pretrained(model_path)
tokenizer.padding_side = 'left' 
tokenizer.pad_token = tokenizer.unk_token

# 加载Aquila模型
model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.float16)
device = torch.device('cuda')
model.to(device)
# 加载示例Context
from cyg_conversation import default_conversation

conv = default_conversation.copy()
contexts = json.load(open('code_text_2.json'))

question = "请解释这段程序的功能:"
batch = []
conv.append_message(conv.roles[0], question)
conv.append_message(conv.roles[1], None)
batch.append(conv.get_prompt())
# 拼接context和question
for ci,context in enumerate(contexts):        
    conv1 = default_conversation.copy()
    conv1.append_message(conv.roles[0], context+question)
    conv1.append_message(conv.roles[1], None)
    batch.append(conv1.get_prompt())
print('Context长度分布:', [len(text) for text in batch])
print('Context总长度:', sum([len(text) for text in batch]))

# Top-P截断
processors = LogitsProcessorList()
processors.append(TopPLogitsWarper(0.95))

# Copied from https://github.com/bojone/NBCE/blob/main/test.py#L51-L106
@torch.inference_mode()
def generate(max_tokens):
    """Naive Bayes-based Context Extension 演示代码
    """
    inputs = tokenizer(batch, padding='longest', return_tensors='pt').to(device)
    input_ids = inputs.input_ids
    attention_mask = inputs.attention_mask
    
    print('input_ids', input_ids.shape)
    past_key_values = None
    n = input_ids.shape[0]
    
    for i in range(max_tokens):
        # 模型输出
        outputs = model(input_ids=input_ids,
                        attention_mask=attention_mask,
                        return_dict=True,
                        use_cache=True,
                        past_key_values=past_key_values
                       )
        past_key_values = outputs.past_key_values
        
        # ===== 核心代码开始 =====
        beta, eta = 0.25, 0.1
        logits = outputs.logits[:, -1]
        logits = logits - logits.logsumexp(dim=-1, keepdims=True)
        logits = processors(input_ids, logits)
        entropy = -(logits.exp() * logits.clip(-100, 0)).sum(dim=-1)
        if i > 0:
            entropy[k] -= eta
        k = entropy[1:].argmin() + 1
        logits_max = logits[k]
        logits_uncond = logits[0]
        logits_merged = (1 + beta) * logits_max - beta * logits_uncond
        logits = torch.where(logits_uncond > -100, logits_merged, logits_max)
        # ===== 核心代码结束 =====
        
        # 构建分布,采样
        # tau = 1是标准的随机采样,tau->0则是贪心搜索
        # 简单起见,这里没有实现topk、topp截断
        tau = 0.01
        probas = torch.nn.functional.softmax(logits[None] / tau , dim=-1)
        next_tokens = torch.multinomial(probas, num_samples=1).squeeze(1)        
        if next_tokens[0] == tokenizer.eos_token_id:
            break
            
        ret = tokenizer.batch_decode(next_tokens)
        print(ret[0], flush=True, end='')
        
        # prepare for next iteration
        input_ids = next_tokens.unsqueeze(-1).tile(n, 1)
        attention_mask = torch.cat([attention_mask, torch.ones(n, 1, dtype=torch.long, device=device)], dim=-1)        


if __name__ == '__main__':
    generate(1000)

证书/License

AquilaChat系列开源模型使用 智源Aquila系列模型许可协议, 原始代码基于Apache Licence 2.0

AquilaChat open-source model is licensed under BAAI Aquila Model Licence Agreement. The source code is under Apache Licence 2.0