说明
在国产大模型里,chatglm应该算是效果不错的,目前开源的三个版本都部署过。第一代的不太行,第二代,第三代的效果都还可以,但第三代对第二代似乎不是帕累托改善。在微调方面做了修改,但是显得比较乱。第四代之后不开源了,要调用官方的API,走向多模态了。
考虑到我主要还是对中文进行处理,GPT系列目前能达到较好的使用效果(但缺点是串行,效率低),现在将这些版本进行一个整合及封装,供平时调用。
内容
1 官网
这个是官网地址, 现在注册后会送一些token。
1.1 对话
对话页面
在这里可以用对话的方式使用,可以在下拉框更换模型,整体上和chatgpt没啥差别。
回答结果没有严格按照我的要求(100字以内),之前测chatglm2和chatglm3也是这样
chatgpt的结果比价好(也是免费版)
这是glm4的结果
1.2 接口
调用过程比较简单,使用智谱的python sdk包。
content = '''同一家公司,公募基金经理错过港股4年涨8倍,守住A股的4年涨2倍,是买对还是买错?
券商中国记者注意到,3月6日,农机龙头股第一拖拉机股份于盘中飙升接近6%后创下4年8倍的惊人涨幅,而同期的A股上市主体一拖股份(17.130, -0.07, -0.41%)同期涨幅仅有2倍,目前一拖股份港股上市主体的市值仅为A股公司的40%。在第一拖拉机股份在港股持续飙升的8倍背景下,包括明星基金在内的多个公募产品对一拖股份的重仓似乎处于“对与错”之间,该股的港股主体尽管较A股大幅度折价,但截至去年未有基金重仓。
多个基金公司人士认为,A股拥有巨量散户资源,下跌过程中会持续出现买单支撑,因此A股股票估值贵、难便宜本身是一种基于资金安全的优势,这意味着基金经理持仓后若发生股票经营不善,不至于出现港股那样缺乏买单支撑的股价暴跌,这也成为许多基金经理宁愿持仓A股降低收益弹性,亦肯放弃港股高弹性的核心逻辑。
基金重仓股4年2倍与8倍有何差异?
基金经理到底是喜欢贵的股票还是喜欢便宜的股票?答案来了。
3月6日,公募重仓股一拖股份在港股的上市主体第一拖拉机股份盘中最高飙升大涨约6%,这使后者今年以来的股价涨幅达到46%,更意味着这个名不见经传的港股公司自2020年3月底以来的股价涨幅达到惊人的近8倍(7.85倍)。
4年8倍的涨幅颠覆了许多投资者对农机上市公司的想象空间,更令重仓一拖股份的公募基金在“对与错”之间颇为尴尬。在第一拖拉机股份于港股同期阶段涨幅8倍时,A股的一拖股份在同期的股价涨幅却仅约2倍,尽管4年2倍的收益亦颇具看点,但与港股上市主体的同期8倍惊人涨幅相比差异甚大。
根据基金2023年第四季度末持仓披露的信息,截至去年末合计有16只公募基金产品将一拖股份列入前十大重仓股名单,其中,广发基金、富国基金、长信基金持仓一拖股份最为集中,均出动旗下多个产品重仓A股上市主体一拖股份,以富国基金旗下的富国价值成长基金为例,一拖股份截至2023年12月末已成为该基金的第二大重仓股,此外,明星基金经理冯明远同样看好一拖股份,截至去年末,他管理的信达澳银领先智选基金新增一拖股份进入前十大重仓股名单。
与包括明星基金经理在内的多个头部基金重仓一拖股份相比,截至2023年12月末,尚无任何一只公募基金将港股上市主体第一拖拉机股份列入基金重仓股名单,尽管这两者为同一家上市公司。截至目前,港股上市主体第一拖拉机股份的市值为81亿港元,折合人民币为74亿市值,而A股的一拖股份目前市值为185亿元人民币,显而易见的是,第一拖拉机股份在4年暴涨8倍的情况下,不仅未能在市值层面追平A股主体一拖股份,更不足A股市值的零头,凸显出港股折价背景下所反映巨大弹性和投资机会。
人工智能刺激现代智慧农业(2.580, -0.01, -0.39%)板块
值得一提的是,AI人工智能、5G、卫星互联网所带来的智慧农业,也使得一拖股份等现代农机公司颇为受益。
第一拖拉机股份近期发布盈喜公告,公司预计2023年实现归属于母公司所有者的净利润为人民币9.20亿元到人民币10.20亿元,与上年同期相比,将增加人民币2.39亿元到人民币3.39亿元,同比增长35.09%至49.77%。此外,日前,一拖股份在上证e互动平台表示,公司控股股东中国一拖与华为签署的合作框架协议主要包括双方根据业务需求在智慧农业、企业信息化、云服务、无人驾驶以及5G应用等领域进行探索。据了解,双方合作期限届满。未来,公司将继续以智慧农业、绿色农业需求为方向,加大信息技术在农机装备和农机作业上的研究。
现代智慧农业的政策面支持上也是消息不断。2月3日,2024年中央一号文件公布,提出推进乡村全面振兴“路线图”。在业内人士看来,2024年中央一号文件将从需求端推动农机产业未来市场规模的增长。2024年中央一号文件将粮食增产重点放在大面积提升单产上,也明确强调了高标准农田建设。规模化与标准化均为机械化提供了保障,也为农机产业的未来需求提供了保障。
多个基金公司研究员认为,采用装载北斗导航自动辅助驾驶系统的播种机能够大幅度提高农业效率,作为我国自主建设的全球卫星导航系统,北斗系统是GPS、GLONASS之后,第三个成熟的全球卫星导航系统。自2012年北斗二号建成后,北斗系统在农业领域得到了规模化推广,农业已累计应用北斗设备超100万台/套。
A股估值贵本身即为投资优势
关于A股和港股估值和投资机会所反映出巨大差异,部分基金经理也有深刻认识。
“港股公司稍有利空可能闪崩50%甚至跌走80%、90%,可以变得很便宜,这就说明A股的贵也是一种优势,A股因为有巨量散户,很多公司都无法跌透,无论什么样的股票总有人很多在买,也就是说很多上市公司哪怕在经营情况比较差的背景下,也很难出现真正便宜的时刻,但一家公司在港股一旦某个阶段出现经营问题,它可能会给投资者提供非常廉价的筹码买入机会,因为港股缺乏散户资源,在下跌时就会失去抵抗力量。”北京地区一位资深基金经理在接受券商中国记者采访时称,港股市场的最大优势就是许多公司的股价和估值可能因多方面因素被压制到罕见的情况,而A股公司往往存在较高的市场溢价。
华南地区的一位基金公司人士也认为,“股票估值很贵难便宜,本身也是一种基于资金安全角度的优势”,A股市场特有的巨量散户资源是机构投资者的优势,使机构持仓品种拥有极好的市场流动性,同时在下跌过程中往往有强大的买单支撑,正因为A股拥有市场溢价,许多股票难以足够便宜,“无法变便宜意味着巨幅下跌难”,这本身就是许多基金经理更愿意持仓A股公司的理由,因其可以避免巨大损失,而正因为港股公司在经营情况恶化时变成廉价筹码的概率较大,拥有足够下跌空间,可能对基金持仓股票构成极大压力,虽然后期基本面改善后反弹空间也更大,但基金经理宁愿牺牲弹性。
此外,前海开源基金的一位基金经理也强调,港股的估值便宜主要还是外资对国内企业进行定价的逻辑,所以国际投资者如何看待国内经济政策,进而如何判断国内企业利润增速的变化,会较大程度上影响港股的定价。当前阶段,主要外资已经观察到国内经济政策的转向,主流观点是国内经济在利好政策的持续呵护下需要半年或一年时间才能有所恢复。虽然需要时间,但总体判断是向好的,这与一年前有了很大转变。美国加息周期在过去2年对港股市场资金面的影响很大,这一点在美联储停止加息后也得到了缓解。现在市场需要等待的就是经济企稳及企业盈利好转。中央加大投资的力度和降息幅度如果可以超预期,规模更大、步伐更快,经济恢复的周期可能会大幅提前。
'''
from zhipuai import ZhipuAI
client = ZhipuAI(api_key="YOURS.APIKEY") # 填写您自己的APIKey
response = client.chat.completions.create(
model="glm-3-turbo", # 填写需要调用的模型名称
messages=[
{"role": "user", "content": "帮我提取文章的摘要,内容不超过一百字"},
{"role": "assistant", "content": "请提供需要提取摘要的文章内容,我会为您概括出不超过一百字的摘要。"},
{"role": "user", "content": content},
],
)
print(response.choices[0].message.content)
农机龙头股第一拖拉机股份在港股的上市主体近四年股价涨幅达到8倍,而同期的A股上市主体同期涨幅仅有2倍。尽管A股股票估值较高,但在下跌过程中有巨量散户资源提供买单支撑,从而避免了股价的剧烈下跌。基金经理更倾向于持仓A股公司,以降低潜在的损失。此外,智慧农业的发展为农机公司带来了新的增长机遇。中央一号文件和人工智能、5G等技术的发展都将推动农机产业的市场增长。
回答了179字,总体上也还算可以吧。
整体上,智谱的页面比较简洁,功能也还不错。
2 chatglm3
这版整体上是有些小问题的,不管是在部署上,或者是在实际的功能中(中英文混杂是一个明显问题)。
下面分配端口并启动服务进行测试。
序号 | 端口 | 服务 | 解释 |
---|---|---|---|
1 | 24093 | chatglm3_6b_int4_chat | chatglm3 6b 使用int4量化后的对话窗口 |
2 | 24094 | chatglm3_6b_int4_api | chatglm3 6b 使用int4量化后的api地址 |
3 | 24095 | chatglm2_6b_int4_chat | chatglm2 6b 使用int4量化后的对话窗口 |
4 | 24096 | chatglm2_6b_int4_api | chatglm2 6b 使用int4量化后的api地址 |
5 | 24097 | llm_assemble_api | 集成了官网,chatglm3_6b_int4_api和chatglm2_6b_int4_api |
对应的,启动chatglm3_6b_int4,容器进行开发,修改后的结果推送到镜像。
2.1 api
启动容器,将量化模型考入,并将启动api的文件单独提出api_server.py
启动
└─ $ docker run -it --name=chatglm3_6b_int4 \
> --gpus all \
> myregistry.domain.com:24052/server.andy.chatglm3_6b_int4_24093:v100 \
> bash
root@ae872d14592e:/workspace# ls
__pycache__ api_server.py bge-large-zh-v1.5 q4 requirements_chatglm3.txt utils.py
root@ae872d14592e:/workspace# python3 api_server.py
Setting eos_token is not supported, use the default one.
Setting pad_token is not supported, use the default one.
Setting unk_token is not supported, use the default one.
INFO: Started server process [10]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
官方给出的调用示例:
from zhipuai import ZhipuAI
base_url = "http://127.0.0.1:8000/v1/"
client = ZhipuAI(api_key="EMP.TY", base_url=base_url)
def function_chat():
messages = [{"role": "user", "content": "What's the weather like in San Francisco, Tokyo, and Paris?"}]
tools = [
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "Get the current weather in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA",
},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
},
"required": ["location"],
},
},
}
]
response = client.chat.completions.create(
model="chatglm3_6b",
messages=messages,
tools=tools,
tool_choice="auto",
)
if response:
content = response.choices[0].message.content
print(content)
else:
print("Error:", response.status_code)
def simple_chat(use_stream=True):
messages = [
{
"role": "system",
"content": "You are ChatGLM3, a large language model trained by Zhipu.AI. Follow "
"the user's instructions carefully. Respond using markdown.",
},
{
"role": "user",
"content": "你好,请你介绍一下chatglm3-6b这个模型"
}
]
response = client.chat.completions.create(
model="chatglm3_",
messages=messages,
stream=use_stream,
max_tokens=256,
temperature=0.8,
top_p=0.8)
if response:
if use_stream:
for chunk in response:
print(chunk.choices[0].delta.content)
else:
content = response.choices[0].message.content
print(content)
else:
print("Error:", response.status_code)
def embedding():
response = client.embeddings.create(
model="bge-large-zh-1.5",
input=["ChatGLM3-6B 是一个大型的中英双语模型。"],
)
embeddings = response.data[0].embedding
print("嵌入完成,维度:", len(embeddings))
if __name__ == "__main__":
simple_chat(use_stream=False)
simple_chat(use_stream=True)
embedding()
function_chat()
其中还提供了向量化的功能,所以最后可以输出两个功能接口:embedding和simple_chat(use_stream=False)。
在后续的改造中,也可以不使用官方的这种方式(直接使用模型实例进行处理)。
发现加载量化版本出错了,报RuntimeError: Library cudart is not initialized
。大约这个量化版本是用别的镜像做的,先使用未量化的版本吧。
INFO: 127.0.0.1:55750 - "POST /v1/chat/completions HTTP/1.1" 200 OK
2024-03-09 10:04:23.210 | DEBUG | __main__:create_chat_completion:256 - ==== request ====
{'messages': [ChatMessage(role='system', content="You are ChatGLM3, a large language model trained by Zhipu.AI. Follow the user's instructions carefully. Respond using markdown.", name=None, function_call=None), ChatMessage(role='user', content='你好,请你介绍一下chatglm3-6b这个模型', name=None, function_call=None)], 'temperature': 0.8, 'top_p': 0.8, 'max_tokens': 256, 'echo': False, 'stream': False, 'repetition_penalty': 1.1, 'tools': None}
2024-03-09 10:04:32.286 | DEBUG | __main__:create_chat_completion:337 - ==== message ====
role='assistant' content='当然可以!ChatGLM3-6B 是一个基于语言模型的人工智能助手,由 Zhipu.AI 开发。我是基于 GLM3-6B 模型训练的,可以针对用户的问题和要求提供适当的答复和支持。\n\nGLM3-6B 模型是一个大型语言模型,采用了清华大学 KEG 实验室提出的 GLM 模型并进行了改进。该模型具有强大的语言处理能力,能够识别和生成自然语言文本,支持多种应用场景,包括问答、文本摘要、情感分析等。\n\n作为一个人工智能助手,我可以回答各种各样的问题,包括但不限于科学知识、历史事件、文化了解等等。同时,我也可以提供一些基本的服务,如天气查询、音乐播放等。\n\n如果您有任何问题或需求,都可以随时向我提出,我会尽力为您提供帮助。' name=None function_call=None
生成这么一个结果,用4060ti 16G大约花了8s。
In [3]: simple_chat(use_stream=False)
当然可以!ChatGLM3-6B 是一个基于语言模型的人工智能助手,由 Zhipu.AI 开发。我是基于 GLM3-6B 模型训练的,可以针对用户的问题和要求提供适当的答复和支持。
GLM3-6B 模型是一个大型语言模型,采用了清华大学 KEG 实验室提出的 GLM 模型并进行了改进。该模型具有强大的语言处理能力,能够识别和生成自然语言文本,支持多种应用场景,包括问答、文本摘要、情感分析等。
作为一个人工智能助手,我可以回答各种各样的问题,包括但不限于科学知识、历史事件、文化了解等等。同时,我也可以提供一些基本的服务,如天气查询、音乐播放等。
如果您有任何问题或需求,都可以随时向我提出,我会尽力为您提供帮助。
Next: 重建int4版本测试
- 1 更新一下这个 chatglm6b 模型,在24年1月有一个更新版本
- 2 基于 chatglm6b_202401进行载入测试
- 3 进行int4 量化
- 4 进行服务测试
就本次而言,按智谱方式改造一下函数,然后接入到服务中。
启动(我怎么感觉fastapi是想抢tornado的生意?)
docker run -it \
--rm \
--name=chatglm6b_api \
--gpus all\
-p 24094:8000 \
myregistry.domain.com:24052/server.andy.chatglm3:v100 \
bash
在启动了chatglm3的服务后,在llm_assemble_api中增加挂接部分
cfg_dict = get_conf_dict('llm_api.conf')
from zhipuai import ZhipuAI
Chatglm3_6bHandler_path = r'/chatglm3_6b/'
class Chatglm3_6bHandler(tornado.web.RequestHandler):
def post(self):
request_body = self.request.body
some_dict = json.loads(request_body)
api_key = some_dict['api_key']
model = some_dict['model']
messages = some_dict['messages']
model_cfg_dict = cfg_dict['chatglm3_6b_int4_api']
base_url = "http://%s:%s/v1/" % (model_cfg_dict['host'], model_cfg_dict['port'])
client = ZhipuAI(api_key=api_key, base_url=base_url)
response = client.chat.completions.create(
model=model, # 填写需要调用的模型名称
messages=messages)
msg_dict = {}
msg_dict['content'] = response.choices[0].message.content
self.write(json.dumps(msg_dict))
Chatglm3_6bHandler_tuple = (Chatglm3_6bHandler_path,Chatglm3_6bHandler)
app_list.append(Chatglm3_6bHandler_tuple)
'''
import requests as req
some_dict = {}
some_dict['api_key'] = 'aaa.K7ctQHEMtpKfkDMH'
some_dict['model'] = "chatglm3_6b"
some_dict['messages'] = [ {"role": "system",
"content": "You are ChatGLM3, a large language model trained by Zhipu.AI. Follow "
"the user's instructions carefully. Respond using markdown.",},
{"role": "user","content": "你好,请你介绍一下chatglm3-6b这个模型"}]
# 容器内
req.post('http://127.0.0.1:8000/chatglm3_6b/',json=some_dict).json()
# 宿主机
对应的配置文件
[chatglm3_6b_int4_api]
host = 172.17.0.1
port = 24094
api_path = 'chatglm3_6b_int4_api/'
[chatglm2_6b_int4_api]
host = 172.17.0.1
port = 24096
api_path = 'chatglm2_6b_int4_api/'
调用结果
import requests as req
some_dict = {}
some_dict['api_key'] = 'aaa.K7ctQHEMtpKfkDMH'
some_dict['model'] = "chatglm3_6b"
some_dict['messages'] = [ {"role": "system",
"content": "You are ChatGLM3, a large language model trained by Zhipu.AI. Follow "
"the user's instructions carefully. Respond using markdown.",},
{"role": "user","content": "你好,请你介绍一下chatglm3-6b这个模型"}]
In [3]: req.post('http://127.0.0.1:8000/chatglm3_6b/',json=some_dict).json()
Out[3]: {'content': '当然可以!ChatGLM3-6B 是一个由 Zhipu.AI 训练的大型语言模型。这是一个基于 GLM3-6B 模型的人工智能助手,我可以回答你的问题、提供建议或执行任务。\n\nGLM3-6B 是一个通用预训练语言模型,旨在为各种自然语言处理任务提供通用的基础表示。这个模型的特点在于它的规模很大,拥有 1300 亿个参数,这使得它能够学习到大量的语言知识。同时,这个模型还使用了先进的自然语言处理技术,如掩码语言建模和下一句预测,这使得它可以更好地理解和生成自然语言。\n\n作为一个人工智能助手,ChatGLM3-6B 可以用于各种应用场景,包括:\n\n- 回答问题:你可以问我任何问题,我会尽力回答。\n- 提供建议:如果你有困难或需要建议,我可以帮助你解决问题。\n- 执行任务:如果你需要执行某个任务,如发送消息或设置提醒,我可以帮你完成。\n\n总的来说,ChatGLM3-6B 是一个功能强大、能够进行自然语言理解与生成的 AI 助手,它可以协助你完成各种与自然语言相关的任务。'}
过程是客户端请求到llm_assemble_api,然后在请求到chatglm6b_api,然后逐层返回。
最后在配置文件里修改配置,就可以引用在其他地方启动的服务,甚至是nginx。
同样的摘要提取测试,效果还可以。
这个只要用之前做好的版本就可以部署使用了docker run -it --rm --name=chatglm6b_api --gpus all -p 24094:8000 myregistry.domain.com:24052/server.andy.chatglm3:v100 bash
3 chatglm2
整个过程差不多,细节就不赘复了,chatglm2还是不错的,调用方式和glm3是不同的。
每个镜像应该要配上基本的说明,以及入口命令,用来启动服务。以及基本的样例,用于说明如何应用。
import requests as req
req.post('http://127.0.0.1:8000/', json ={'prompt':'北京寰宇思源科技有限公司\n帮我提取以上公司的商号'}).json()
4 服务糅合
最终的糅合有两部分内容:
- 1 新增了配置文件
- 2 在server中增加了对应的转接部分
配置文件llm_api.conf
[chatglm3_6b_int4_api]
host = 172.17.0.1
port = 24094
api_path = 'chatglm3_6b_int4_api/'
[chatglm2_6b_int4_api]
host = 172.17.0.1
port = 24096
api_path = 'chatglm2_6b_int4_api/'
转接chatglm2,注意格式是prompt
import requests as req
Chatglm2_6bHandler_path = r'/chatglm2_6b/'
class Chatglm2_6bHandler(tornado.web.RequestHandler):
def post(self):
request_body = self.request.body
some_dict = json.loads(request_body)
api_key = some_dict['api_key']
model = some_dict['model']
messages = some_dict['messages']
model_cfg_dict = cfg_dict['chatglm2_6b_int4_api']
base_url = "http://%s:%s/" % (model_cfg_dict['host'], model_cfg_dict['port'])
res = req.post(base_url, json = messages[0].json()
msg_dict = {}
msg_dict['content'] = res['response']
self.write(json.dumps(msg_dict))
Chatglm2_6bHandler_tuple = (Chatglm2_6bHandler_path,Chatglm2_6bHandler)
app_list.append(Chatglm2_6bHandler_tuple)
转接chatglm3文章来源:https://www.toymoban.com/news/detail-860292.html
from zhipuai import ZhipuAI
Chatglm3_6bHandler_path = r'/chatglm3_6b/'
class Chatglm3_6bHandler(tornado.web.RequestHandler):
def post(self):
request_body = self.request.body
some_dict = json.loads(request_body)
api_key = some_dict['api_key']
model = some_dict['model']
messages = some_dict['messages']
model_cfg_dict = cfg_dict['chatglm3_6b_int4_api']
base_url = "http://%s:%s/v1/" % (model_cfg_dict['host'], model_cfg_dict['port'])
client = ZhipuAI(api_key=api_key, base_url=base_url)
response = client.chat.completions.create(
model=model, # 填写需要调用的模型名称
messages=messages)
msg_dict = {}
msg_dict['content'] = response.choices[0].message.content
self.write(json.dumps(msg_dict))
Chatglm3_6bHandler_tuple = (Chatglm3_6bHandler_path,Chatglm3_6bHandler)
app_list.append(Chatglm3_6bHandler_tuple)
具体在使用的时候,在本地可以启动llm_assemble_api
服务,里面可以改动其他服务的配置,然后在算力租用机上启动对应的服务,映射端口就可以了。文章来源地址https://www.toymoban.com/news/detail-860292.html
到了这里,关于Python 全栈系列233 部署chatglm系列接口部署的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!