听闻大名,说了拿下了中文榜单第一名:ChatGLM-6B第二代模型开源,拿下LLM模型中文能力评估榜单第一名

排行榜原地址:https://cevalbenchmark.com/static/leaderboard_zh.html

ChatGLM2-6B 支持

  • FP16,最厉害,但是需要的资源也最多
  • int8,中庸
  • int4,最笨,但是资源也最少

FP16 火力全开

多卡互联

我有两个 M60,各是 8GB 的显存。因为跑 FP16 需要 12.5GB 的显存,所以必须上两个卡

代码如下:

from transformers import AutoTokenizer, AutoModel
import os
from typing import Dict, Tuple, Union, Optional

from torch.nn import Module
from transformers import AutoModel


def auto_configure_device_map(num_gpus: int) -> Dict[str, int]:
    # transformer.word_embeddings 占用1层
    # transformer.final_layernorm 和 lm_head 占用1层
    # transformer.layers 占用 28 层
    # 总共30层分配到num_gpus张卡上
    num_trans_layers = 28
    per_gpu_layers = 30 / num_gpus

    # bugfix: 在linux中调用torch.embedding传入的weight,input不在同一device上,导致RuntimeError
    # windows下 model.device 会被设置成 transformer.word_embeddings.device
    # linux下 model.device 会被设置成 lm_head.device
    # 在调用chat或者stream_chat时,input_ids会被放到model.device上
    # 如果transformer.word_embeddings.device和model.device不同,则会导致RuntimeError
    # 因此这里将transformer.word_embeddings,transformer.final_layernorm,lm_head都放到第一张卡上
    # 本文件来源于https://github.com/THUDM/ChatGLM-6B/blob/main/utils.py
    # 仅此处做少许修改以支持ChatGLM2
    device_map = {
        'transformer.embedding.word_embeddings': 0,
        'transformer.encoder.final_layernorm': 0,
        'transformer.output_layer': 0,
        'transformer.rotary_pos_emb': 0,
        'lm_head': 0
    }

    used = 2
    gpu_target = 0
    for i in range(num_trans_layers):
        if used >= per_gpu_layers:
            gpu_target += 1
            used = 0
        assert gpu_target < num_gpus
        device_map[f'transformer.encoder.layers.{i}'] = gpu_target
        used += 1

    return device_map


def load_model_on_gpus(checkpoint_path: Union[str, os.PathLike], num_gpus: int = 2,
                       device_map: Optional[Dict[str, int]] = None, **kwargs) -> Module:
    if num_gpus < 2 and device_map is None:
        model = AutoModel.from_pretrained(
            checkpoint_path, trust_remote_code=True, **kwargs).half().cuda()
    else:
        from accelerate import dispatch_model

        model = AutoModel.from_pretrained(
            checkpoint_path, trust_remote_code=True, **kwargs).half()

        if device_map is None:
            device_map = auto_configure_device_map(num_gpus)

        model = dispatch_model(model, device_map=device_map)

    return model


tokenizer = AutoTokenizer.from_pretrained(
    "THUDM/chatglm2-6b", trust_remote_code=True)
model = load_model_on_gpus("THUDM/chatglm2-6b", num_gpus=2)

model = model.eval()


response, history = model.chat(tokenizer, "你好", history=[])
print(response)

# response, history = model.chat(tokenizer, "晚上睡不着应该怎么办", history=history)
# print(response)

看看效果

Q:爸爸的爸爸叫什么?

A:

爸爸的爸爸叫爷爷。

Q:华雄为什么要斩关羽

A:

华雄斩关羽的背景是董卓联合吕布等人,共同反董。当时,董卓指使吕布等人去进攻刘备的部队。刘备的将领华雄与吕布激战,华雄最终击败了吕布。之后,华雄在追杀刘备的部队时,被关羽所杀。

Q:用 python 写一段代码,要求使用 requests 库上传图片到服务端

A:

好的,以下是一段使用 requests 库上传图片到服务端的 Python 代码示例:

import requests

# 上传图片的文件名和存储图片的路径
file_name = "example.jpg"
file_path = "path/to/image.jpg"

# 设置请求头部信息,例如:Content-Type 和 Authorization
headers = {
    "Content-Type": "multipart/form-data",
    "Authorization": "Bearer YOUR_API_KEY"
}

# 打开图片文件并读取内容
with open(file_path, "rb") as f:
    img_data = f.read()

# 发送图片内容到服务端
response = requests.post(
    "https://example.com/upload",
    files={"image": ("image.jpg", img_data, "image/jpeg")},
    headers=headers
)

# 打印服务器返回的结果
print(response.status_code)
print(response.text)

在上面的代码中,我们首先定义了上传图片的文件名和存储图片的路径。然后设置请求头部信息,例如 Content-Type 和 Authorization。接着我们打开图片文件并读取内容,然后使用 requests.post 方法发送图片内容到服务端。在发送请求时,我们使用了 files 参数,将图片文件作为 Multipart/Form-Data 类型的文件上传到服务端。最后,我们打印服务器返回的结果和返回的文本内容。

请注意,在上面的示例中,我们将 Content-Type 设置为 "multipart/form-data",并将 Authorization 设置为 "Bearer YOUR_API_KEY"。这取决于您与服务端交互时所使用的身份验证方法。如果您的服务端要求使用身份验证,您需要根据其文档中的要求更改这些设置。

int8 ,中庸者

这部分有空再写

int4,穷鬼套餐

原始代码

from transformers import AutoTokenizer, AutoModel


tokenizer = AutoTokenizer.from_pretrained(
    "THUDM/chatglm2-6b-int4", trust_remote_code=True)
model = AutoModel.from_pretrained(
    "THUDM/chatglm2-6b-int4", trust_remote_code=True).float()


model = model.eval()


response, history = model.chat(tokenizer, "你好", history=[])
print(response)

response, history = model.chat(tokenizer, "晚上睡不着应该怎么办", history=history)
print(response)

cpu 下的速度测试

因为我是穷鬼,我想看看这个 int4 模型在 cpu 下的速度

  • 消耗的内存:5.3GB
  • 消耗的 CPU:28 core cpu

我的 CPU:Intel(R) Xeon(R) CPU E5-2690 v4 @ 2.60GHz

s=time.time()
response, history = model.chat(tokenizer, "晚上睡不着应该怎么办")
print(response)
e=time.time()
logger.debug(f'pay time is {round(e-s,2)} 秒')

输出

以下是一些有助于快速入睡的技巧:

1. 创建一个放松的睡前环境。这包括一个安静、凉爽的卧室,以及舒适的床垫、枕头和床单。

2. 避免使用电子设备。在睡前几小时到睡前1小时之间,尽量避免使用手机、平板电脑、笔记本电脑等电子设备。

3. 规律的睡眠时间。尽量在同一时间上床和下床。

4. 放松身体和头脑。在睡前30分钟到1小时内,进行一些轻松的活动,如阅读、听轻柔的音乐或进行伸展运动,有助于缓解身体和头脑的压力。

5. 避免饮用刺激性饮料。在睡前2小时到1小时内,避免饮用咖啡、茶、酒和碳酸饮料等刺激性饮料。

6. 找到一个放松的睡前活动。进行一些感兴趣的活动,如练习瑜伽或冥想,有助于缓解压力和放松身心。

如果这些技巧不能解决你的问题,可以考虑咨询医生或睡眠专家,获取更深入的帮助。
2023-06-30 08:42:39.594 | DEBUG    | __main__:<module>:25 - pay time is 1274.51 秒

太离谱了,这个回答用了 1274 秒,还是 28 个 cpu core 跑的结果


universe_king
3.4k 声望678 粉丝