OpenBMB/CPM-Bee 开源

昨日都快睡觉了,看到了微信群里的一条消息,

     基座模型CPM-Bee 发布啦!

     百亿量级参数、万亿级高质量语料
     评测中文稳居ZeroCLUE榜首,英文媲美LLaMA
    ⚙️ 配套 OpenBMB 大模型体系生态支撑
     彻底开源,允许商用

      https://github.com/OpenBMB/CPM-Bee,点亮 打造你的专属模型吧!

嗯嗯 写的不错,准备今天看看是什么玩意,感觉是想做成一个像java开发中的eclipse / IDEA那样的一个根底东西,想法很好

装置

装置很正常,有一个小插曲

Traceback (most recent call last):
File "<string>", line 2, in <module>
File "<pip-setuptools-caller>", line 34, in <module>
File "C:\Users\xxx\AppData\Local\Temp\pip-install-fnh8zism\bmtrain\_f44721c4bc3f4a989665b2c225f69095\setup.py", line 52, in <module>
CUDAExtension('bmtrain.nccl.\_C', \[
         Traceback (most recent call last):
            File "<string>", line 2, in <module>
            File "<pip-setuptools-caller>", line 34, in <module>
            File "C:\Users\xxx\AppData\Local\Temp\pip-install-fnh8zism\bmtrain_f44721c4bc3f4a989665b2c225f69095\setup.py", line 52, in <module>
              CUDAExtension('bmtrain.nccl._C', [

从CUDAExtension 就知道应该到有 CUDA的服务器上装置,由于我本身学习的笔记本没有GPU,嗯嗯,换到GPU的服务器上 履行ok

 error: subprocess-exited-with-error
   python setup.py bdist_wheel did not run successfully.
  │ exit code: 1
  ╰─> [61 lines of output]
      running bdist_wheel
      C:\ProgramData\Anaconda3\envs\base03\lib\site-packages\torch\utils\cpp_extension.py:411: UserWarning: Attempted to use ninja as the BuildExtension backend but we could not find ninja.. Falling back to using the slow distutils backend.
        warnings.warn(msg.format('we could not find ninja.'))
      running build
      running build_py
ERROR: Failed building wheel for bmtrain
  Running setup.py clean for bmtrain
Failed to build bmtrain
ERROR: Could not build wheels for bmtrain, which is required to install pyproject.toml-based projects

跑了下

from cpm_live.generation.bee import CPMBeeBeamSearch
from cpm_live.models import CPMBeeTorch, CPMBeeConfig
from cpm_live.tokenizers import CPMBeeTokenizer
from opendelta import LoraModel
import torch
prepare your input data.
data_list = [
    {"input": "今天天气是真的<mask>", "prompt": "往后写一句话", "<ans>": {"<mask>": ""}},
    {"input": "北京市气象台提示,4月12日午后偏南风加大,阵风可达6级左右,南下的沙尘或许随同回流北上进京,外出仍需留意<mask_0>,做好健康防护。天津市气象台也提示,受<mask_1>影响,我市4月12日有浮尘天气,PM10浓度<mask_2>。请留意关好门窗,白叟儿童尽量削减户外活动,外出留意带好<mask_3>。” ","<ans>":{"<mask_0>":"","<mask_1>":"","<mask_2>":"","<mask_3>":""}},
]
# load model
config = CPMBeeConfig.from_json_file("cpm-bee-5b.json")
ckpt_path = "cpm-bee-5b-ckpt.pt"
tokenizer = CPMBeeTokenizer()
model = CPMBeeTorch(config=config)
# insert LoRA
# delta_model = LoraModel(backbone_model=model, modified_modules=["project_q", "project_v"], backend="hf")
# load checkpoints
model.load_state_dict(torch.load(ckpt_path))
model.cuda()
# use beam search
beam_search = CPMBeeBeamSearch(
    model=model,
    tokenizer=tokenizer,
)
for data in data_list:
    inference_results = beam_search.generate([data], max_length=100)
    for res in inference_results:
        print(res)
# output:
# {'input': '今天天气是真的<mask>', 'prompt': '往后写一句话', '<ans>': {'<mask>': '好啊!'}}
# {'input': '北京市气象台提示,4月12日午后偏南风加大,阵风可达6级左右,南下的沙尘或许随同回流北上进京,外出仍需留意<mask_0>,做好健康防护。天津市气象台也提示,受<mask_1>影响,我市4月12日有浮尘天气,PM10浓度<mask_2>。请留意关好门窗,白叟儿童尽量削减户外活动,外出留意带好<mask_3>。” ', '<ans>': {'<mask_0>': '防风', '<mask_1>': '沙尘天气', '<mask_2>': '较高', '<mask_3>': '口罩'}}

现在支撑 文字填空、文本生成、翻译、问答、评分预测、文本选择题

简略测验下来,现在功能还有待增加和增强,能够当国内的备用方案

Embedding,给文本分分类

经过 API 核算 Token 数量

榜首种核算 Token 数量的方式,是从 API 回来的成果里边获取。我们修改一下刚才的 Conversation 类,重新创建一个 Conversation2 类。和之前只要一个不同,ask 函数除了回来回复的消息之外,还会回来这次恳求耗费的 Token 数。

class Conversation2:
def **init**(self, prompt, num\_of\_round):
self.prompt = prompt
self.num\_of\_round = num\_of\_round
self.messages = \[]
self.messages.append({"role": "system", "content": self.prompt})
    def ask(self, question):
        try:
            self.messages.append( {"role": "user", "content": question})
            response = openai.ChatCompletion.create(
                model="gpt-3.5-turbo",
                messages=self.messages,
                temperature=0.5,
                max_tokens=2048,
                top_p=1,
            )
        except Exception as e:
            print(e)
            return e
        message = response["choices"][0]["message"]["content"]
        num_of_tokens = response['usage']['total_tokens']
        self.messages.append({"role": "assistant", "content": message})
        if len(self.messages) > self.num_of_round*2 + 1:
            del self.messages[1:3]
        return message, num_of_tokens

conv2 = Conversation2(prompt, 3)
questions = [question1, question2, question3, question4, question5]
for question in questions:
    answer, num_of_tokens = conv2.ask(question)
    print("问询 {%s} 耗费的token数量是 : %d" % (question, num_of_tokens))输出成果:

输出成果


问询 {你是谁?} 耗费的token数量是 : 108
问询 {请问鱼香肉丝怎么做?} 耗费的token数量是 : 410
问询 {那蚝油牛肉呢?} 耗费的token数量是 : 733
问询 {我问你的榜首个问题是什么?} 耗费的token数量是 : 767
问询 {我问你的榜首个问题是什么?} 耗费的token数量是 : 774

假如你想削减token的耗费,能够做个总结,然后往下传递,这样能够必定程度的削减token的耗费,毕竟是依据token进行 收费的

ChatGPT 的对话模型用起来很便利,但是也有一点需求留意。就是在这个需求传送很多上下文的情况下,这个费用会比你想象的高。OpenAI 是经过模型处理的 Token 数量来收费的,但是要留意,这个收费是“双向收费”。它是依照你发送给它的上下文,加上它回来给你的内容的总 Token 数来核算花费的 Token 数量的。

这个从模型的原理上是合理的,由于每一个 Token,无论是你发给它的,仍是它回来给你的,都需求经过 GPU 或者 CPU 运算。所以你发的上下文越长,它耗费的资源也越多。但是在运用中,你或许觉得我来了 10 轮对话,一共 1000 个 Token,就只会收 1000 个 Token 的费用。而实际上,榜首轮对话是只耗费了 100 个 Token,但是第二轮由于要把前面的上下文都发送出去,所以需求 200 个,这样 10 轮下来,是需求花费 5500 个 Token,比前面说的 1000 个可多了不少。