Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GLM-4-9B-chat FastApi报AttributeError: 'ChatGLMForConditionalGeneration' object has no attribute 'chat' #249

Open
hongmin118 opened this issue Aug 27, 2024 · 5 comments

Comments

@hongmin118
Copy link

image

之前用pip install --upgrade transformers能解决。
但是这次新开一台机器后,仍然抛错。
连续2台autodl上的机器都出现同样的错误,可能代码里有问题哦。

@nishuone028
Copy link

transformers版本调低一点可以使用

@skywatcherfanl
Copy link

用哪个版本可用,我也遇到同样的问题

@Williamleejx
Copy link

问题不是出现在transformers的版本问题,是zhipu更新后对modeling_chatglm.py文件进行了修改,新的文件把chat模块删除了,去找个旧的这个文件替换一下吧

@kjcx100
Copy link

kjcx100 commented Sep 25, 2024

问题不是出现在transformers的版本问题,是zhipu更新后对modeling_chatglm.py文件进行了修改,新的文件把chat模块删除了,去找个旧的这个文件替换一下吧

这个文件在那找哦,具体放到哪啊?

@xiaobox
Copy link

xiaobox commented Oct 16, 2024

原因: ChatGLMForConditionalGeneration 模型对象没有 chat 方法

解决办法:1 我们需要修改模型的调用方式。不使用 chat 方法,而是使用 generate 方法。2 我们还需要修改输入的处理方式,使用 tokenizer 来准备输入

我的 transformers 版本是 4.42.4 下面是我修改过并且可运行的 api.py的代码

from fastapi import FastAPI, Request
from transformers import AutoTokenizer, AutoModelForCausalLM
import uvicorn
import json
import datetime
import torch

# 设置设备参数
DEVICE = "cuda"  # 使用CUDA
DEVICE_ID = "0"  # CUDA设备ID,如果未设置则为空
CUDA_DEVICE = f"{DEVICE}:{DEVICE_ID}" if DEVICE_ID else DEVICE  # 组合CUDA设备信息

# 清理GPU内存函数
def torch_gc():
    if torch.cuda.is_available():  # 检查是否可用CUDA
        with torch.cuda.device(CUDA_DEVICE):  # 指定CUDA设备
            torch.cuda.empty_cache()  # 清空CUDA缓存
            torch.cuda.ipc_collect()  # 收集CUDA内存碎片

# 创建FastAPI应用
app = FastAPI()

# 处理POST请求的端点
@app.post("/")
async def create_item(request: Request):
    global model, tokenizer  # 声明全局变量以便在函数内部使用模型和分词器
    json_post_raw = await request.json()  # 获取POST请求的JSON数据
    json_post = json.dumps(json_post_raw)  # 将JSON数据转换为字符串
    json_post_list = json.loads(json_post)  # 将字符串转换为Python对象
    prompt = json_post_list.get('prompt')  # 获取请求中的提示
    history = json_post_list.get('history')  # 获取请求中的历史记录
    max_length = json_post_list.get('max_length', 2048)  # 获取请求中的最大长度
    top_p = json_post_list.get('top_p', 0.7)  # 获取请求中的top_p参数
    temperature = json_post_list.get('temperature', 0.95)  # 获取请求中的温度参数

    # 准备输入
    messages = []
    if history:
        for h in history:
            messages.append({"role": "user", "content": h[0]})
            messages.append({"role": "assistant", "content": h[1]})
    messages.append({"role": "user", "content": prompt})

    input_ids = tokenizer.apply_chat_template(messages, return_tensors="pt").to(model.device)

    # 生成回复
    with torch.no_grad():
        outputs = model.generate(
            input_ids,
            max_new_tokens=max_length,
            do_sample=True,
            top_p=top_p,
            temperature=temperature,
        )

    response = tokenizer.decode(outputs[0][input_ids.shape[1]:], skip_special_tokens=True)

    now = datetime.datetime.now()  # 获取当前时间
    time = now.strftime("%Y-%m-%d %H:%M:%S")  # 格式化时间为字符串
    # 构建响应JSON
    answer = {
        "response": response,
        "history": history + [[prompt, response]],
        "status": 200,
        "time": time
    }
    # 构建日志信息
    log = "[" + time + "] " + '", prompt:"' + prompt + '", response:"' + repr(response) + '"'
    print(log)  # 打印日志
    torch_gc()  # 执行GPU内存清理
    return answer  # 返回响应

# 主函数入口
if __name__ == '__main__':
    # 加载预训练的分词器和模型
    tokenizer = AutoTokenizer.from_pretrained("/root/autodl-tmp/ZhipuAI/glm-4-9b-chat", trust_remote_code=True)
    model = AutoModelForCausalLM.from_pretrained(
        "/root/autodl-tmp/ZhipuAI/glm-4-9b-chat",
        torch_dtype=torch.bfloat16,
        trust_remote_code=True,
        device_map="auto",
    )
    model.eval()  # 设置模型为评估模式
    # 启动FastAPI应用
    # 用6006端口可以将autodl的端口映射到本地,从而在本地使用api
    uvicorn.run(app, host='0.0.0.0', port=6006, workers=1)  # 在指定端口和主机上启动应用

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

9 participants
@hongmin118 @xiaobox @kjcx100 @nishuone028 @skywatcherfanl @Williamleejx and others