本文主要是介绍【腾讯云 HAI域探秘】——自行搭建Stable Diffusion模型服务用于生成AI图片 | 自行搭建ChatGL M26BAI模型服务用于AI对话,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
自行搭建Stable Diffusion模型服务用于生成AI图片
一、服务创建
1、服务地址:
高性能应用服务HAI 新品内测
2、等待审核(大概24小时)
二、创建服务
1、新建服务
2、选择AI模型:Stable Diffusion
高性能,效率更快。
3、等待创建(5~8分钟)
这里可以看到温馨提示,创建中不计费的。
创建完成效果:
三、操作面板介绍
1、webui操作
都是鼠标点击操作,方便。
2、jupyter_lab操作
命令行操作,有一定难度,但是按照步骤可以一步步搞定哦。自己配置接口,多舒服。
四、webui操作步骤
1、中文插件安装
步骤1、选择Extensions、
步骤2、选择Available、
步骤3、按照图示选择
步骤4、搜索zh_CH
步骤5、点击【Load from】进行搜索
搜索效果
搜索【zh_CN】找到后,点击【install】进行安装。
安装完毕效果
2、配置中文插件操作步骤
按照下图操作,其中步骤3是在没有看到zh_CN的情况下刷新一下。
3、Reload UI后效果
刷新后能看到中文的显示状态。刚才我们在扩展中安装了中文的插件,在设置中配置了中文插件。
页面说明,这个图给的描述很详细。
数据示例:
参数名 | 描述 | 值 |
---|---|---|
提示词 | 主要描述图像,包括内容风格等信息,原始的webui会对这个地方有字数的限制,可以安装一些插件突破字数的限制 | a pretty cat,cyberpunk art,kerem beyit,very cute robot zen,Playful,Independent,beeple |
反向提示词 | 为了提供给模型,我们不需要的风格 | (deformed,distorted,disfigured:1.0),poorly drawn,bad anatomy,wrong anatomy,extra limb,missing limb,floating limbs,(mutated hands and fingers:1.5),disconnected limbs,mutation,mutated,ugly,disgusting,blurry,amputation,flowers,human,man,woman |
提示词相关性(CFG scale) | 分类器自由引导尺度——图像与提示符的一致程度——越低的值产生的结果越有创意,数值越大成图越贴近描述文本。一般设置为7 | 7 |
采样方法(Sampling method) | 采样模式,即扩散算法的去噪声采样模式会影响其效果,不同的采样模式的结果会有很大差异,一般是默认选择euler,具体效果我也在逐步尝试中。 | Euler a |
采样迭代步数(Sampling steps) | 在使用扩散模型生成图片时所进行的迭代步骤。每经过一次迭代,AI就有更多的机会去比对prompt和当前结果,并作出相应的调整。需要注意的是,更高的迭代步数会消耗更多的计算时间和成本,但并不意味着一定会得到更好的结果。然而,如果迭代步数过少,一般不少于50,则图像质量肯定会下降 | 80 |
随机种子(Seed) | 随机数种子,生成每张图片时的随机种子,这个种子是用来作为确定扩散初始状态的基础。不懂的话,用随机的即可 | 127361827368 |
随机种子也可以自己添加,下面的实验我用-1和
实验效果:
随机种子实验效果
五、jupyter_lab操作步骤
1、进入jupyter_lab操作页面
操作页面效果
2、面板功能介绍
3、启动服务
命令如下,直接复制并【ctrl+v】即可
cd /root/stable-diffusion-webui
python launch.py --nowebui --xformers --opt-split-attention --listen --port 7862
命令参数描述:
命令 | 描述 |
---|---|
--nowebui | 以 API 模式启动 |
--xformers | 使用xformers库。极大地改善了内存消耗和速度。 |
--opt-split-attention | Cross attention layer optimization 优化显着减少了内存使用,几乎没有成本(一些报告改进了性能)。黑魔法。默认情况下torch.cuda,包括 NVidia 和 AMD 卡。 |
--listen | 默认启动绑定的 ip 是 127.0.0.1,只能是你自己电脑可以访问 webui,如果你想让同个局域网的人都可以访问的话,可以配置该参数(会自动绑定 0.0.0.0 ip)。 |
--port | 默认端口是 7860,如果想换个端口,可以配置该参数,例如:--port 7862 |
--gradio-auth username:password | 如果你希望给 webui 设置登录密码,可以配置该参数,例如:--gradio-auth GitLqr:123456。 |
本地启动效果(不支持公网访问,可以看到是127.0.0.1:7862)
启动效果(支持公网访问,可以看到是0.0.0.0:7862)
4、添加7862端口规则
操作1、进入模型操作面板
添加7862端口号码
添加端口操作
3、访问swagger接口
访问地址:ip:7862端口
六、python接口解析生成AI图片
1、打开python开发工具
我们使用的是【PyCharm Community Edition 2023.1.4】版本。
2、创建py文件并输入以下代码
注:这里一定要修改服务的IP,也就是公网的那个IP
import json
import base64
import requestsyour_ip = '0.0.0.0' # HAI服务器IP地址
your_port = 7862 # SD api 监听的端口def submit_post(url: str,data: dict):"""Submit a POST request to the given URL with the given data."""return requests.post(url,data=json.dumps(data))def save_encoded_image(b64_image: str,output_path: str):"""Save the given image to the given output path."""with open(output_path,"wb") as image_file:image_file.write(base64.b64decode(b64_image))if __name__ == '__main__':# /sdapi/v1/txt2imgtxt2img_url = f'http://{your_ip}:{your_port}/sdapi/v1/txt2img'data = {'prompt': 'a pretty cat,cyberpunk art,kerem beyit,very cute robot zen,Playful,Independent,beeple |','negative_prompt':'(deformed,distorted,disfigured:1.0),poorly drawn,bad anatomy,wrong anatomy,extra limb,missing limb,floating limbs,(mutated hands and fingers:1.5),disconnected limbs,mutation,mutated,ugly,disgusting,blurry,amputation,flowers,human,man,woman','Steps':50,'Seed':127361827368}response = submit_post(txt2img_url,data)save_encoded_image(response.json()['images'][0],'cat.png')
参数说明
名称 | 说明 |
---|---|
prompt | 提示词 |
negative_prompt | 反向提示词 |
seed | 种子,随机数 |
batch_size | 每次张数 |
n_iter | 生成批次 |
steps | 生成步数 |
cfg_scale | 关键词相关性 |
width | 宽度 |
height | 高度 |
restore_faces | 脸部修复 |
tiling | 可平铺 |
sampler_index | 采样方法 |
3、运行效果
可以看到生成的图片就在对应的文件夹内,我们还可以改很多参数。
Stable Diffusion模型总结
图片生成,还是用处非常多的,而且价格也比较划算,使用和配置都很方便,效率也好高,可以自己搭建尝试一下,很棒的。
自行搭建ChatGL M26BAI模型服务用于AI对话
单独访问效果:
vscode内运行效果:
我们使用腾讯云来创建,有完整的操作流程,很方便我们搭建使用。
一、服务创建
创建效果:
新建服务
服务选择:(这里可以下拉选择大一些的硬盘)
剩余的时间需要等待。
创建完毕效果:
二、操作面板介绍
1、chatglm_gradio:
我们可以直接通过这个网址进行对话操作。
2、jupyter_lab:
创建控制台窗口,可以在这里进行具体的代码编辑与运行。
三、基础服务示例(jupyter_lab操作)
1、进入并启动服务
cd /root/ChatGLM2-6B/
python api.py
运行起来能看到有信息提示。
2、启动后开启访问端口(8000)
进入到服务详情。
添加防火墙可通过的端口号。
添加效果:
3、Python接口访问效果
添加后即可访问:http://你的公网IP:8000/ 的这个接口,具体服务参数如下列代码:
import requests# 定义测试数据,以及FastAPI服务器的地址和端口
server_url = "http://0.0.0.0:8000" # 请确保将地址和端口更改为您的API服务器的实际地址和端口
test_data = {"prompt": "'电影雨人讲的是什么?'","history": [],"max_length": 50,"top_p": 0.7,"temperature": 0.95
}# 发送HTTP POST请求
response = requests.post(server_url, json=test_data)# 处理响应
if response.status_code == 200:result = response.json()print("Response:", result["response"])print("History:", result["history"])print("Status:", result["status"])print("Time:", result["time"])
else:print("Failed to get a valid response. Status code:", response.status_code)
访问效果:
四、正式服务代码
1、修改【openai-api.py】文件
使用以下代码覆盖原有的代码:
# coding=utf-8
# Implements API for ChatGLM2-6B in OpenAI's format. (https://platform.openai.com/docs/api-reference/chat)
# Usage: python openai_api.py
# Visit http://localhost:8000/docs for documents.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 memoryyieldif 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: strobject: str = "model"created: int = Field(default_factory=lambda: int(time.time()))owned_by: str = "owner"root: Optional[str] = Noneparent: Optional[str] = Nonepermission: Optional[list] = Noneclass ModelList(BaseModel):object: str = "list"data: List[ModelCard] = []class ChatMessage(BaseModel):role: Literal["user", "assistant", "system"]content: strclass DeltaMessage(BaseModel):role: Optional[Literal["user", "assistant", "system"]] = Nonecontent: Optional[str] = Noneclass ChatCompletionRequest(BaseModel):model: strmessages: List[ChatMessage]temperature: Optional[float] = Nonetop_p: Optional[float] = Nonemax_length: Optional[int] = Nonestream: Optional[bool] = Falseclass ChatCompletionResponseChoice(BaseModel):index: intmessage: ChatMessagefinish_reason: Literal["stop", "length"]class ChatCompletionResponseStreamChoice(BaseModel):index: intdelta: DeltaMessagefinish_reason: Optional[Literal["stop", "length"]]class ChatCompletionResponse(BaseModel):model: strobject: 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_argsmodel_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, tokenizerif request.messages[-1].role != "user":raise HTTPException(status_code=400, detail="Invalid request")query = request.messages[-1].contentprev_messages = request.messages[:-1]if len(prev_messages) > 0 and prev_messages[0].role == "system":query = prev_messages.pop(0).content + queryhistory = []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, tokenizerchoice_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 = 0for new_response, _ in model.stream_chat(tokenizer, query, history):if len(new_response) == current_length:continuenew_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)
2、运行【openai-api.py】文件,服务端开启服务
在控制台直接输入python openai-api.py即可运行
五、可视化页面搭建
1、在创建cloud Studio的时候选择【应用推荐】
选择【ChatGPT Next Web】
2、Fork项目
3、修改【.env.template】文件
直接替换我下面的就行,但是需要替换一下你服务的IP。
# Your openai api key. (required)
OPENAI_API_KEY="hongMuXiangXun"# Access passsword, separated by comma. (optional)
CODE=# You can start service behind a proxy
PROXY_URL=http://你的IP:8000# Override openai api request base url. (optional)
# Default: https://api.openai.com
# Examples: http://your-openai-proxy.com
BASE_URL=http://你的IP:8000# Specify OpenAI organization ID.(optional)
# Default: Empty
OPENAI_ORG_ID=# (optional)
# Default: Empty
# If you do not want users to input their own API key, set this value to 1.
HIDE_USER_API_KEY=# (optional)
# Default: Empty
# If you do not want users to use GPT-4, set this value to 1.
DISABLE_GPT4=# (optional)
# Default: Empty
# If you do not want users to query balance, set this value to 1.
HIDE_BALANCE_QUERY=
4、修改【.env.template】为【.env】文件
鼠标右键,重命名即可。
六、运行可视化操作页面
1、新建终端
2、运行服务
先运行npm的安装,在通过【yarn dev】启动。
npm installyarn dev
安装时间较长,别急,等一会。
运行yarn dev效果:
3、选择打开方式
这里需要选择到端口处进行具体的选择,选择方式如下图。
我觉得这个页面设计的还是不错的。
内部访问效果也OK:
到此,恭喜你,创建完毕了。
ChatGL M26BAI模型总结、
整体上六个大步骤,没有消耗多长时间,我是搞了一遍之后开始写的这篇文章,故而看着时间长一些,其实熟练操作也就分分钟的事情,应该是适合绝大多数的程序员来操作的。
操作不复杂,基本都有提示,希望对大家都能有所帮助,下面我单独问了一个问题,就是我们程序员未来发展之路,未遂没有一个具体解答,但是还是很中肯的,那就是学无止境。
现在还有活动呢,下面是活动的连接:
腾讯云 HAI 新品公测产品体验地址 :https://cloud.tencent.com/act/pro/hai
腾讯云 HAI 新品公测专题页地址:https://marketing.csdn.net/p/b18dedb1166a0d94583db1877e49b039
腾讯云 HAI 新品公测活动报名地址:https://jinshuju.net/f/dHxwJ7
这篇关于【腾讯云 HAI域探秘】——自行搭建Stable Diffusion模型服务用于生成AI图片 | 自行搭建ChatGL M26BAI模型服务用于AI对话的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!