一、开通和配置ECS
1、 创建ECS实例(以Ubuntu系统为例),作为登录数据库的客户端。设置ECS用户名及登录密码(使用ecs-user登录,如果使用root安装,后续部分安装包会提示有权限风险)。
2、 设置安全组配置,配置出方向端口22,并在源IP中加入本机IP。
3、本机ssh到云ECS。
二、部署文生图模型
说明:这部分内容笔者是基于阿里云Lindorm AI数据服务平台来构建的,因为该平台安装部署AIGC相关的模型(如文生图、LLM等)非常简便,而且提供了服务化的类SQL接口,可以非常便捷的实现文生图接口调用。如果读者有其他方式部署,也可以修改文生图接口调用部分的代码,实现其他形式的调用。
1、 根据产品指导书,开通Lindorm AI引擎来实现文生图功能,完成Stable Diffusion的安装部署。该方案部署Stable Diffusion非常简便,仅需一条简单的SQL命令即可完成安装。使用也非常简便,也是一条简洁的SQL即可。
2、 将ECS客户端IP加入到Lindorm数据库白名单,确保ECS可以正常访问Lindorm数据库。可以在ECS上安装Lindorm CLI客户端进行测试。
3、 在ECS上安装phoenixdb(用于连接数据库):pip install phoenixdb==1.2.0
注意:有些系统版本在安装时,可能会报错“subprocess.CalledProcessError: Command 'krb5-config --libs gssapi' returned non-zero exit status 127”,原因是缺乏安装依赖,需执行如下命令后再安装:sudo apt-get -y install gcc libkrb5-dev
三、编写Streamlit文生图网页程序
说明:该程序运行在ECS上,用于对外提供网页版文生图服务界面,并对外提供公网访问。
1、 在ECS上安装Streamlit需要的模块:pip install streamlit pip install streamlit-chat
2、 编写Streamlit网页程序(Python脚本)。
#!/bin/python3# -*- coding: utf-8 -*-importstreamlitasstimportphoenixdbimportbase64fromconfigs.lindorm_config_t2iimport*# global env:如下配置正式使用时请放在单独的配置文件中,如:lindorm_config_t2i# 这里的链接地址与lindorm-cli的链接地址比,需要去掉http之前的字符串# LINDORM_URL = "http://ld-XXXX-proxy-lindorm-pub.lindorm.rds.aliyuncs.com:30060"# LINDORM_USER_NAME = 'XXXX'# LINDORM_USER_PW = 'XXXX'# LLM_MODEL = 'stable_diffusion_model'# 连接到lindorm数据库defconnect(kw_args): try: returnphoenixdb.connect(LINDORM_URL, autocommit=True, **kw_args) exceptAttributeError: print("Failed to connect") # 连接Lindorm数据库,调用AI数据服务平台SQL查询接口,获取Lindorm知识库问答结果# 用户名通过lindorm_user字段传递,密码使用lindorm_password字段设置,database字段设置连接初始化默认数据库。connect_kw_args= {'lindorm_user': LINDORM_USER_NAME, 'lindorm_password': LINDORM_USER_PW, 'database': 'default'} connection=connect(connect_kw_args) st.set_page_config( page_title="文生图", page_icon=":robot:", layout='wide') st.title("文生图-小文") # 选择采样方法SD_Sampler=st.sidebar.selectbox( '采样方法', ('DDIM','LMSDiscrete','DPMSolverMultistep','EulerAncestralDiscrete','EulerDiscrete','PNDM') ) # 采样迭代步数SD_Steps=st.sidebar.slider( 'Steps', 1, 150, 30, step=1) # 提示词引导系数SD_CFG_Scale=st.sidebar.slider( 'CFG_Scale', 1.0, 30.0, 7.5, step=0.5) SD_Random_Seed=st.sidebar.slider( 'Random_Seed', -1, 300, 128, step=1) # 用户输入promptifprompt :=st.chat_input("请在这儿输入您的提示词"): response=""withconnection.cursor() asstatement: # 查询Lindorm AI实例,返回生成的图片链接sql_select="select ai_infer('%s', '%s', 'scheduler=%s,steps=%d,guidanceScale=%f,seed=%d,base64Output=true')" \ % (LLM_MODEL, prompt, SD_Sampler,SD_Steps,SD_CFG_Scale,SD_Random_Seed) statement.execute(sql_select) sql_response=statement.fetchall() base64_str=sql_response[0][0] # 查询返回是list格式,需要取list[0][0],转换为str格式:base64_strimg_data=base64.b64decode(base64_str) # 将base64_str解码为图片#print("type of sql_response:", type(sql_response))st.image(img_data) connection.close()
代码详解:
Lindorm提供了类JDBC的连接和使用方式,使用起来非常简便。对于文生图的调用,直接使用SQL查询方式即可返回生成的图片。目前支持两种模式:1,返回base64 str格式的图片(设置参数base64Output=true),该模式支持公网调用。2、返回jpg图片内网URL链接,只支持内网访问。本文选用更为灵活的模式1来获取生成的图片。最后将返回图片在界面上进行展示即可:
sql_select = "select ai_infer('%s', '%s', 'scheduler=%s,steps=%d,guidanceScale=%f,seed=%d,base64Output=true')" \
% (LLM_MODEL, prompt, SD_Sampler,SD_Steps,SD_CFG_Scale,SD_Random_Seed)
statement.execute(sql_select)
sql_response = statement.fetchall()
base64_str = sql_response[0][0] # 查询返回是list格式,需要取list[0][0],转换为str格式:base64_str
img_data = base64.b64decode(base64_str) #将base64_str解码为图片
st.image(img_data)
3、 添加安全组规则:在ECS实例安全组的入方向添加安全组规则,将需要访问服务网页的IP地址或地址段添加到8501端口的源(该端口是Streamlit默认服务端口,也可以自定义)。
4、运行脚本:nohup streamlit run text_to_image.py &。如果要指定服务端口,则需要在安全组放行该端口,运行时带上端口参数,如:nohup streamlit run text_to_image.py--server.port 6006 &。程序运行后会打印网页URL地址。
四、效果展示
在浏览器中输入网页URL地址,即可进行文生图了。该地址是ECS的公网IP,具备公网访问能力,且可以通过配置安全组8501端口的访问源IP来实现访问源的控制,使用起来非常便捷。
五、必薅羊毛
对于喜欢研究学习文生图、LLM、知识库、智能问答等AIGC爱好者,或想借助AIGC能力用于工作、学习中的人,发现阿里云最近有系列AIGC相关的优惠活动推出。
在此推荐一个文生图、智能问答相关的AIGC优惠活动:秒级开通,仅60元/月,即刻畅享文生图、私域知识库、LLM智能问答系统。
首次开通还可获得100元猫超卡奖励,目前该奖励活动还在有效期内,手慢无。
活动链接:https://www.aliyun.com/activity/ambassador/Lindorm
开通后,即刻就能使用,界面截图: