[详细教程] 服务器上用gradio无法远程访问

情况描述:在服务器部署的ChatGLM3-6B,使用ChatGLM3/basic_demo/web_demo_gradio.py启动频频出错。首先介绍通用的gradio远程访问遇到报错的解决方法,后面为同样在部署ChatGLM3的你介绍需要解决的软件版本依赖。

报错内容:

To create a public link, set `share=True` in `launch()`.

解决:对正在执行的.py文件进行修改,在demo.launch函数中设置share=True

demo.launch(server_name=socket.gethostbyname(socket.gethostname()), server_port=7870, inbrowser=True, share=True)

报错内容:

Could not create share link. Missing file: /root/miniconda3/envs/myenv/lib/python3.10/site-packages/gradio/frpc_linux_amd64_v0.3. 

Please check your internet connection. This can happen if your antivirus software blocks the download of this file. You can install manually by following these steps: 

1. Download this file: https://cdn-media.huggingface.co/frpc-gradio-0.3/frpc_linux_amd64
2. Rename the downloaded file to: frpc_linux_amd64_v0.3
3. Move the file to this location: /root/miniconda3/envs/myenv/lib/python3.10/site-packages/gradio

解决:按照上面的三条照做就行

报错内容:

Could not create share link. Please check your internet connection or our status page: https://status.gradio.app.

解决:为刚刚放进去的文件添加执行权限

chmod +x /root/miniconda3/envs/myenv/lib/python3.10/site-packages/gradio/frpc_linux_amd64_v0.3

报错内容:

2025/02/16 19:18:28 [W] [service.go:132] login to server failed: EOF

Could not create share link. Please check your internet connection or our status page: https://status.gradio.app.

解决:对正在执行的.py文件进行修改,在demo.launch函数中设置server_name='0.0.0.0'

demo.launch(server_name='0.0.0.0', server_port=7870, inbrowser=True, share=True)

原因:服务器上部署的gradio能够远程访问需要①服务器连接到Gradio官网②Gradio官网生成一个公共访问的URL,让其它电脑能够访问到服务器发出的内容。

因此如果server_name='127.0.0.1',那么服务器发出的数据只能被服务器访问,原因如下:

【计算机网络】localhost,127.0.0.1 和 0.0.0.0傻傻分不清?这篇文章带你认识_localhost:127.0.0.1 ,0.0.0.0-优快云博客

同时要确认Gradio官网稳定运行,其官网链接:https://status.gradio.app

解决完这些就可以

①复制服务器SSH登录的登录指令和密码,并替换到相应位置

②查看demo.launch()函数中的server_port=7870,并替换到相应位置

例:登录指令:ssh -p 12345 root@connect.nmb1.seetacloud.com

ssh -CNg -L6006:127.0.0.1:7870 root@connect.nmb1.seetacloud.com -p 12345

③然后把替换好的指令用在cmd,之后手动输入刚刚复制下来的密码就可以

④浏览器访问http://127.0.0.1:6006


如果你是在部署ChatGLM3-6B时遇到了和我描述中一样的问题,可以参考我解决依赖包的方法:

时间:2025.2.16

遇到报错1:

ModuleNotFoundError: No module named 'peft'

解决:

pip install peft 

遇到报错2:

ImportError: cannot import name 'EncoderDecoderCache' from 'transformers' (/root/miniconda3/envs/myenv/lib/python3.10/site-packages/transformers/__init__.py)

解决:

pip install --upgrade transformers  #我下载到的是4.48.3

共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区。在/proc/sys/kernel/目录下,记录着共享内存的一些限制,如一个共享内存区的最大字节数shmmax,系统范围内最大共享内存区标识符数shmmni等,可以手工对其调整,但不推荐这样做。 一、应用 共享内存的使用,主要有以下几个API:ftok()、shmget()、shmat()、shmdt()及shmctl()。 1)用ftok()函数获得一个ID号. 应用说明: 在IPC中,我们经常用用key_t的值来创建或者打开信号量,共享内存和消息队列。 函数原型: key_t ftok(const char *pathname, int proj_id); Keys: 1)pathname一定要在系统中存在并且进程能够访问的 3)proj_id是一个1-255之间的一个整数值,典型的值是一个ASCII值。 当成功执行的时候,一个key_t值将会被返回,否则-1被返回。我们可以使用strerror(errno)来确定具体的错误信息。 考虑到应用系统可能在不同的主机上应用,可以直接定义一个key,而不用ftok获得: #define IPCKEY 0x344378 2)shmget()用来开辟/指向一块共享内存的函数 应用说明: shmget()用来获得共享内存区域的ID,如果不存在指定的共享区域就创建相应的区域。 函数原型: int shmget(key_t key, size_t size, int shmflg); key_t key 是这块共享内存的标识符。如果是父子关系的进程间通信的话,这个标识符用IPC_PRIVATE来代替。如果两个进程没有任何关系,所以就用ftok()算出来一个标识符(或者自己定义一个)使用了。 int size 是这块内存的大小. int flag 是这块内存的模式(mode)以及权限标识。 模式可取如下值: IPC_CREAT 新建(如果已创建则返回目前共享内存的id) IPC_EXCL 与IPC_CREAT结合使用,如果已创建则则返回错误 然后将“模式” 和“权限标识”进行“或”运算,做为第三个参数。 如: IPC_CREAT | IPC_EXCL | 0640 例子中的0666为权限标识,4/2/1 分别表示读/写/执行3种权限,第一个0是UID,第一个6(4+2)表示拥有者的权限,第二个4表示同组权限,第3个0表示他人的权限。 这个函数成功时返回共享内存的ID,失败时返回-1。 关于这个函数,要多说两句。 创建共享内存时,shmflg参数至少需要 IPC_CREAT | 权限标识,如果只有IPC_CREAT 则申请的地址都是k=0xffffffff,不能使用; 获取已创建的共享内存时,shmflg不要用IPC_CREAT(只能用创建共享内存时的权限标识,如0640),否则在某些情况下,比如用ipcrm删除共享内存后,用该函数并用IPC_CREAT参数获取一次共享内存(当然,获取失败),则即使再次创建共享内存也不能成功,此时必须更改key来重建共享内存。 3) shmat()将这个内存区映射到本进程的虚拟地址空间。 函数原型: void *shmat( int shmid , char *shmaddr , int shmflag ); shmat()是用来允许本进程访问一块共享内存的函数。 int shmid是那块共享内存的ID。 char *shmaddr是共享内存的起始地址,如果shmaddr为0,内核会把共享内存映像到调用进程的地址空间中选定位置;如果shmaddr不为0,内核会把共享内存映像到shmaddr指定的位置。所以一般把shmaddr设为0。 int shmflag是本进程对该内存的操作模式。如果是SHM_RDONLY的话,就是只读模式。其它的是读写模式 成功时,这个函数返回共享内存的起始地址。失败时返回-1。 4) shmdt()函数删除本进程对这块内存的使用,shmdt()与shmat()相反,是用来禁止本进程访问一块共享内存的函数。 函数原型: int shmdt( char *shmaddr ); 参数char *shmaddr是那块共享内存的起始地址。 成功时返回0。失败时返回-1。 5) shmctl() 控制对这块共享内存的使用 函数原型: int shmctl( int shmid , int cmd , struct shmid_ds *buf ); int shmid是共享内存的ID。 int cmd是控制命令,可取值如下: IPC_STAT 得到共享内存的状态 IPC_SET 改变共享内存的状态 IPC_RMID 删除共享内存 struct shmid_ds *buf是一个结构体指针。IPC_STAT的时候,取得的状态放在这个结构体中。如果要改变共享内存的状态,用这个结构体指定。 返回值: 成功:0 失败:-1
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值