在当今全球化的背景下,英语已成为国际交流的重要语言。对于科研人员来说,英文论文是他们发表成果和交流的必备渠道。
但由于自身英语水平的限制,很多科研人员在英文论文写作中遇到了困难,表达不够专业和流畅,影响论文的质量和价值,导师和审稿人会因为文章中出现的“Chinglish”而对论文进行扣分或拒稿,这对于科研人员来说既是一种挑战,也是一种烦恼。
在这篇文章中,我将分享如何利用高性能应用服务HAI快速部署ChatGLM2-6B-int4,然后使用神奇的咒语心法将ChatGLM2-6B-int4变为英文润色专家,利用其强大的语言模型和自然语言处理能力对英文论文进行润色和优化,从而提升论文的质量和价值。
温馨提示:
- 咒语心法要准确表达、具体情景,提醒它慢思考
- GPT的翻译和润色辅助请仅作参考,避免过度依赖。
- 关于事实性、数值性的文本,要自己验证后使用,不要轻易相信它斩钉截铁的语气,更不要用于查文献。
一、ChatGLM2-6B简介
ChatGLM2-6B是基于 General Language Model (GLM)
架构的对话语言模型,是清华大学 KEG 实验室和智谱 AI 公司于 2023 年共同发布的语言模型。模型有 62 亿参数,一经发布便受到了开源社区的欢迎,在中文语义理解和对话生成上有着不凡的表现。
ChatGLM-6B 可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。ChatGLM-6B 针对中文问答和对话进行了优化,经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,已经能生成相当符合人类偏好的回答,其优点如下:
- 较低的部署门槛: FP16 半精度下,ChatGLM-6B 需要至少 13GB 的显存进行推理,结合模型量化技术,一需求可以进一步降低到 10GB(INT8) 和 6GB(INT4), 使得 ChatGLM-6B
可以部署在消费级显卡上。- 更长的序列长度: 相比 GLM-10B(序列长度1024),ChatGLM2-6B 序列长度达32K,支持更长对话和应用。
- 人类意图对齐训练: 使用了监督微调(Supervised Fine-Tuning)、反馈自助(Feedback Bootstrap)、人类反馈强化学习(Reinforcement Learning from Human Feedback)等方式,使模型初具理解人类指令意图的能力。输出格式为 markdown,方便展示。
二、高性能应用服务HAI
2.1、高性能应用服务HAI是什么?
腾讯云高性能应用服务(Hyper Application Inventor, HAI) , 是一款腾讯云面向Al、科学计算的GPU应用服务产品,是为开发者量身打造的澎湃算力平台。无需复杂配置,便可享受即开即用的GPU云服务体验。
2.2、为什么选择高性能应用服务HAI?
目前的大语言模型在私人化部署场景上存在环境配置复杂,部署难度大。模型效果调试难,无可视化界面。模型、数据集储存流程繁琐,难以快捷保存等痛点,而HAI的一键部署特性可以在短短几分钟内构建ChatGLM等热门模型的应用环境,其预置国内外主流LLM大语言模型。具有可视化界面一键登录,方便调优打通云上存储组件,支持模型、数据集快捷存储等多种优点。
三、高性能应用服务HAI快速部署ChatGLM2-6B-int4
3.1、建立AI模型
首先点击链接进入 高性能应用服务 HAI(https://cloud.tencent.com/act/pro/hai)
申请体验资格,等待审核通过后,点击体验HAI进入高性能应用服务 HAI 控制台,点击新建,选择AI模型、ChatGLM2-6B,地域可以随意选择一个,然后算力方案选择进阶型的算力方案,如果显示售罄的话也可以购买基础型的算力方案(0.88元/小时),并在创建成功后参考实验过程中关闭 、重新开启 webui 功能的命令,以提高服务器的性能!
等待创建完成后,点击算力连接,选择chatglm2_gradio进入webui页面:
就可以体验和 ChatGLM2-6B 的对话了,我们测试一下,问下他先有鸡还是先有蛋,然后再问下他鸡兔同笼的问题,效果如下:
3.2、使用 JupyterLab部署 ChatGLM2-6B API 服务
在 算力管理 页面,点击算力连接,选择进入 jupyter_lab 页面:
如果您购买使用的是 基础型算力服务器(0.88元/小时) 请输入以下指令关闭 webui 功能的命令,提高服务器的性能,进阶版不用输入:
apt-get update && apt-get install sudo
sudo apt-get update
sudo apt-get install psmisc
sudo fuser -k 6889/tcp #执行这条命令将关闭 HAI提供的 chatglm2_gradio webui功能
打开右边ChatGLMM2-6B文件夹下的 openai_api.py 文件
将openai_api.py的内容全部替换为以下代码:
# coding=utf-8
import time
import torch
import uvicorn
from pydantic import BaseModel, Field
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from contextlib import asynccontextmanager
from typing import Any, Dict, List, Literal, Optional, Union
from transformers import AutoTokenizer, AutoModel
from sse_starlette.sse import ServerSentEvent, EventSourceResponse
@asynccontextmanager
async def lifespan(app: FastAPI): # collects GPU memory
yield
if torch.cuda.is_available():
torch.cuda.empty_cache()
torch.cuda.ipc_collect()
app = FastAPI(lifespan=lifespan)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
class ModelCard(BaseModel):
id: str
object: str = "model"
created: int = Field(default_factory=lambda: int(time.time()))
owned_by: str = "owner"
root: Optional[str] = None
parent: Optional[str] = None
permission: Optional[list] = None
class ModelList(BaseModel):
object: str = "list"
data: List[ModelCard] = []
class ChatMessage(BaseModel):
role: Literal["user", "assistant", "system"]
content: str
class DeltaMessage(BaseModel):
role: Optional[Literal["user", "assistant", "system"]] = None
content: Optional[str] = None
class ChatCompletionRequest(BaseModel):
model: str
messages: List[ChatMessage]
temperature: Optional[float] = None
top_p: Optional[float] = None
max_length: Optional[int] = None
stream: Optional[bool] = False
class ChatCompletionResponseChoice(BaseModel):
index: int
message: ChatMessage
finish_reason: Literal["stop", "length"]
class ChatCompletionResponseStreamChoice(BaseModel):
index: int
delta: DeltaMessage
finish_reason: Optional[Literal["stop", "length"]]
class ChatCompletionResponse(BaseModel):
model: str
object: Literal["chat.completion", "chat.completion.chunk"]
choices: List[Union[ChatCompletionResponseChoice, ChatCompletionResponseStreamChoice]]
created: Optional[int] = Field(default_factory=lambda: int(time.time()))
@app.get("/v1/models", response_model=ModelList)
async def list_models():
global model_args
model_card = ModelCard(id="gpt-3.5-turbo")
return ModelList(data=[model_card])
@app.post("/v1/chat/completions", response_model=ChatCompletionResponse)
async def create_chat_completion(request: ChatCompletionRequest):
global model, tokenizer
if request.messages[-1].role != "user":
raise HTTPException(status_code=400, detail="Invalid request")
query = request.messages[-1].content
prev_messages = request.messages[:-1]
if len(prev_messages) > 0 and prev_messages[0].role == "system":
query = prev_messages.pop(0).content + query
history = []
if len(prev_messages) % 2 == 0:
for i in range(0, len(prev_messages), 2):
if prev_messages[i].role == "user" and prev_messages[i+1].role == "assistant":
history.append([prev_messages[i].content, prev_messages[i+1].content])
if request.stream:
generate = predict(query, history, request.model)
return EventSourceResponse(generate, media_type="text/event-stream")
response, _ = model.chat(tokenizer, query, history=history)
choice_data = ChatCompletionResponseChoice(
index=0,
message=ChatMessage(role="assistant", content=response),
finish_reason="stop"
)
return ChatCompletionResponse(model=request.model, choices=[choice_data], object="chat.completion")
async def predict(query: str, history: List[List[str]], model_id: str):
global model, tokenizer
choice_data = ChatCompletionResponseStreamChoice(
index=0,
delta=DeltaMessage(role="assistant"),
finish_reason=None
)
chunk = ChatCompletionResponse(model=model_id, choices=[choice_data], object="chat.completion.chunk")
#yield "{}".format(chunk.json(exclude_unset=True, ensure_ascii=False))
yield "{}".format(chunk.model_dump_json(exclude_unset=True))
current_length = 0
for new_response, _ in model.stream_chat(tokenizer, query, history):
if len(new_response) == current_length:
continue
new_text = new_response[current_length:]
current_length = len(new_response)
choice_data = ChatCompletionResponseStreamChoice(
index=0,
delta=DeltaMessage(content=new_text),
finish_reason=None
)
chunk = ChatCompletionResponse(model=model_id, choices=[choice_data], object="chat.completion.chunk")
#yield "{}".format(chunk.json(exclude_unset=True, ensure_ascii=False))
yield "{}".format(chunk.model_dump_json(exclude_unset=True))
choice_data = ChatCompletionResponseStreamChoice(
index=0,
delta=DeltaMessage(),
finish_reason="stop"
)
chunk = ChatCompletionResponse(model=model_id, choices=[choice_data], object="chat.completion.chunk")
#yield "{}".format(chunk.json(exclude_unset=True, ensure_ascii=False))
yield "{}".format(chunk.model_dump_json(exclude_unset=True))
yield '[DONE]'
if __name__ == "__main__":
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm2-6b", revision="v1.0", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", revision="v1.0", trust_remote_code=True).cuda()
# 多显卡支持,使用下面两行代替上面一行,将num_gpus改为你实际的显卡数量
# from utils import load_model_on_gpus
# model = load_model_on_gpus("THUDM/chatglm2-6b", num_gpus=2)
model.eval()
uvicorn.run(app, host='0.0.0.0', port=8000, workers=1)
然后在终端输入python openai_api.py
,启动服务:
3.3、新增服务器端口规则
为了使外部网络能够顺利地访问该服务器提供的API服务,我们还需要给 高性能应用服务HAI 配置端口规则,点击服务器的图标进入配置项:
添加入站规则,配置来源0.0.0.0/0 ,协议端口:TCP:7862 (根据您配置的端口填写),如下:
至此HAI部署ChatGLM2-6B-int4的任务完美成功!后面我们使用Cloud Studio来进行调用试试!
四、使用 Cloud Studio 创建ChatGPT Next Web 私人英文润色专家
4.1、启动 ChatGPT Next Web 开源项目
打开腾讯Cloud Studio,在左侧点击应用推荐,选择ChatGPT Next Web,点击Fork,等待工作空间创建。
然后打开 .env.template 文件,将文件重命名为.env,然后修改配置信息如下:
- 将OPENAI_API_KEY设置为test
- 将CODE设置为空
- 将PROXY_URL设置为:
服务器的IP:8000
- 将BASE_URL也设置为:
服务器的IP:8000
然后打开终端,输入命令npm install
安装依赖,依赖安装完成后,输入命令yarn dev
开启服务,如下:
然后会自动弹出一个端口窗口,可以点击打开内置预览或者打开浏览器,进入GPT Next Web页面
4.2、私人英文润色专家 魔法咒语指南
打开之后,页面如下:
但是GPT的利用很大程度上取决于你如何设置提示词,许多人在尝试论文润色时的操作基本上就是:直接粘贴一段英文论文;简单地给出一个提示词,例如:“润色”。
这会限制GPT的发挥,因为润色这个范围实在是宽泛了。是润色的更加通俗? 更加专业? 更加地道?没有一个明确的标准。而ChatGPT是无数语料喂出来的,可以把它想象成许多作家聚在一起,根据海量的文字资料来帮你写东西。如果你只给一个很一般性的要求,它就只能给你生成一个一般性的、用在哪里都行但是用在哪里都不是最恰当的内容。不加以引导很难真正将其功能运用到极致。
我们输入一下魔法咒语,让它进入特定角色:
我希望你能担任英语翻译、拼写校对和修辞改进的角色。我会用任何语言和你交流,你会识别语言,将其翻译并用更为优美和精炼的英语回答我。请将我简单的词汇和句子替换成更为优美和高雅的表达方式,确保意思不变,但使其更具文学性。请仅回答更正和改进的部分,不要写解释。我的第一句话是“Hello,nice to meet you!”,请翻译它。
效果如下:
如果需要单个词,单个句子进行修改和润色,并且希望给出每条修改意见的话,可以使用以下咒语:
我会用任何语言和你交流,你会识别语言,将其翻译并用更为优美和精炼的英语回答我。你现在扮演一个[这里放你所研究的领域] 领域的英文专家,从专业的角度,您认为上面这些内容是否有需要修改的地方?注意,不要全文修改,您需要一一指出需要修改的地方,并且给出修改意见以及推荐的修改内容。
如果需要控制润色方向,可以在咒语中增加一下限制:
- 更精确的措辞(More precise):选择更精确的词汇,例如使用“generate”代替“produce”或“analyze”代替“look at”。
- 更简练的表达(More concise):消除不必要的词语和短语,使句子更加清晰、直接。更客观的语言(More objective):删除主观性语言,以中立的方式呈现信息。
- 更具体的描述(More specific):提供更具体的细节,以支持论点或想法。
- 更连贯的表达(More coherent):确保句子组织良好,逻辑流畅。
- 更一致的风格(More consistent):确保句子所使用的语言和风格与论文的其余部分一致。
- 更符合学术风格(More academic):使用学术写作中常用的术语和短语,例如“furthermore”和“thus”。
- 更正式的语法(More formal grammar):使用正确的语法和句法,例如避免句子碎片或跑题的句子。
- 更具细节的描述(More nuanced):通过使用词语或短语来传达更复杂或微妙的含义,使句子更具细节。
五、高性能应用服务HAI 使用体验
在使用HAI的过程中,我感受到了它作为一款面向AI和科学计算的GPU应用服务产品所带来的种种优势。首先,HAI可以根据应用匹配推选GPU算力资源,实现最高性价比。这使得我们在进行AI模型训练和复杂科学计算时,可以更加灵活地选择适合的计算资源,不仅可以提高计算效率,还可以大大节约成本。
其次,HAI提供了一键部署功能,可以在分钟级自动构建LLM、AI作画等应用环境。更为重要的是,它还提供了多种预装模型环境,包括热门模型StableDiffusion和ChatGLM2等,这大大减少了我们进行应用构建和调试的时间和精力,让开发者可以更加专注于模型的设计和优化。此外,HAI提供了友好的图形界面,也就是可视化界面,使得AI调试更为简单和直观。这使得我们可以更加直观地观察模型的输出和优化结果,快速检测和解决问题,提高工作效率,减少出错概率。
HAI作为一款智能化、高性能、易用和安全的GPU应用服务产品,为我们进行AI模型训练和复杂科学计算提供了极大的便利和支持,使得我们可以更加专注于创新和研究,快速迭代和优化模型,实现更好的效果和业绩。