初识InternStudio开发机
获取邀请码
打开OpenXLab浦源主页,完成注册登录,得到以下页面:
点击书生·浦语大模型实战营,进入报名页面进行报名,如下:
报名完成后,会在邮箱中收到InternStudio
的邀请码。
创建开发机
得到邀请码后,打开https://studio.intern-ai.org.cn/,进入InternStudio
(更多详细信息可以查看文档),完成登录会自动跳转到控制台界面,如下图所示:
在首页,点击“创建开发机”,选择创建个人开发机:
名称填写为第3期课程,镜像选择Cuda12.2,资源配置选择10%,时长默认就行。
创建完成以后在开发机界面可以看到刚刚创建的开发机,点击进入开发机。
通过VSCode连接开发机
在我们开发学习的时候,每次远程都输入密码比较麻烦,我们可以设置SSH key来跳过输入密码。
配置SSH密钥
在PowerShell
终端中,我们可以使用ssh-keygen命令来生成密钥
SSH密钥是一种安全便捷的登录认证方式,用于在SSH协议中进行身份验证和加密通信。
ssh-keygen支持RSA和DSA两种认证密钥。
常用参数包括:
- -t:指定密钥类型,如dsa、ecdsa、ed25519、rsa。
- -b:指定密钥长度。
- -C:添加注释。
- -f:指定保存密钥的文件名。
- -i:读取未加密的ssh-v2兼容的私钥/公钥文件。
这里我们使用RSA算法生成密钥,打开PowerShell
终端,输入以下命令:
ssh-keygen -t rsa
输入命令后,一路回车就可以了,这里的密钥默认情况下是生成在~/.ssh/
目录下的,~
表示的是家目录,如果是windows就是C:\Users\{your_username}\
。在PowerShell
中可以使用Get-Content
命令查看生成的密钥,如果是linux操作系统可以使用cat
命令。
然后我们回到开发机平台,在首页点击配置SSH Key,接着点击添加SSH公钥,
将刚刚生成的密钥复制下来,粘贴到公钥框中,名称会被自动识别到,最后点击立即添加,SSH Key就配置完成了。
至此,完成SSH Key创建。此后,通过终端进行远程连接,就会跳过密码输入了。
使用VScode进行SSH远程连接
如果要在VScode中进行远程连接,我们还需要安装一套插件,可以在点击左侧的扩展页面,在搜索框中输入“SSH”,第一个就是我们要安装的插件,点开它“Install”就可以了。
安装完成插件以后,点击侧边栏的远程连接图标,在SSH中点击“+”按钮,添加开发机SSH连接的登录命令(在开发机页面找到我们创建的开发机,点击SSH连接,即可得到登录命令)。
我们将登录命令复制下来,然后将命令粘贴到弹出的窗口中,最后回车:
配置文件这一块默认就好,当然你也可以自定义,下面是配置文件的具体内容:(这里包括了你所有远程连接过的信息)
Host ssh.intern-ai.org.cn #主机ip也可以是域名
HostName ssh.intern-ai.org.cn #主机名
Port 37367 #主机的SSH端口
User root #登录SSH使用的用户
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
完成连接后,得到如下页面:
端口映射
什么是端口映射?
端口映射是一种网络技术,它可以将外网中的任意端口映射到内网中的相应端口,实现内网与外网之间的通信。通过端口映射,可以在外网访问内网中的服务或应用,实现跨越网络的便捷通信。
那么我们使用开发机为什么要进行端口映射呢?
因为在后续的课程中我们会进行模型web_demo的部署实践,那在这个过程中,很有可能遇到web ui加载不全的问题。这是因为开发机Web IDE中运行web_demo时,直接访问开发机内 http/https 服务可能会遇到代理问题,外网链接的ui资源没有被加载完全。
所以为了解决这个问题,我们需要对运行web_demo的连接进行端口映射,将外网链接映射到我们本地主机,我们使用本地连接访问,解决这个代理问题。
我们先根据一个图了解一下开发机端口映射是如何工作的:
在本地主机上运行以下命令即可进行端口映射:
ssh -p 37367 root@ssh.intern-ai.org.cn -CNg -L {本地机器_PORT}:127.0.0.1:{开发机_PORT} -o StrictHostKeyChecking=no
下面给他大家介绍一下命令各部分的含义:
个人PC会远程连接到开发机唯一暴露在外的37367端口,(这个在SSH的时候提到过每个人的开发机暴露的端口都不一样),并设置隧道选项。暴露端口是作为中转站进行流量的转发。
-p 37367
:是指定 SSH 连接的端口为 37367,这个前面提到过。root@ssh.intern-ai.org.cn
:表示要以root
用户身份连接到ssh.intern-ai.org.cn
这个主机。-CNg
:-C
启用压缩,减少传输数据量。通常用于启用压缩。-N
不执行远程命令,只建立隧道。表示不执行远程命令,仅建立连接用于端口转发等。-g
允许远程主机连接到本地转发的端口。
-L {本地机器_PORT}:127.0.0.1:{开发机_PORT}
:这是设置本地端口转发,将本地机器的指定端口(由{本地机器_PORT}
表示)转发到远程主机(这里即ssh.intern-ai.org.cn
)的127.0.0.1
(即本地回环地址)和指定的开发机端口(由{开发机_PORT}
表示)。-o StrictHostKeyChecking=no
:关闭严格的主机密钥检查,这样可以避免第一次连接时因为未知主机密钥而产生的提示或错误。
比如,假设在个人PC上执行以下SSH命令:
ssh -p 37367 root@ssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyChecking=no
SSH客户端会在本地机器的7860端口上监听。
任何发送到本地7860端口的流量,都会被SSH隧道转发到远程服务器的127.0.0.1地址上的7860端口。
这意味着,即使开发机的这个端口没有直接暴露给外部网络,我们也可以通过这个隧道安全地访问远程服务器上的服务。
端口映射示例
当你运行一个web demo的时候,就可以使用这个命令进行端口映射,举个例子:
我们创建一个hello_world.py文件,在文件中填入以下内容:
import socket
import re
import gradio as gr
# 获取主机名
def get_hostname():
hostname = socket.gethostname()
match = re.search(r'-(\d+)$', hostname)
name = match.group(1)
return name
# 创建 Gradio 界面
with gr.Blocks(gr.themes.Soft()) as demo:
html_code = f"""
<p align="center">
<a href="https://intern-ai.org.cn/home">
<img src="https://intern-ai.org.cn/assets/headerLogo-4ea34f23.svg" alt="Logo" width="20%" style="border-radius: 5px;">
</a>
</p>
<h1 style="text-align: center;">☁️ Welcome {get_hostname()} user, welcome to the ShuSheng LLM Practical Camp Course!</h1>
<h2 style="text-align: center;">😀 Let’s go on a journey through ShuSheng Island together.</h2>
<p align="center">
<a href="https://github.com/InternLM/Tutorial/blob/camp3">
<img src="https://oss.lingkongstudy.com.cn/blog/202406301604074.jpg" alt="Logo" width="20%" style="border-radius: 5px;">
</a>
</p>
"""
gr.Markdown(html_code)
demo.launch()
在VSCode中运行上述脚本,在本地PowerShell中
运行ssh -p 37367 root@ssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyChecking=no
进行端口映射,浏览器打开http://127.0.0.1:7860
,即可得到如下页面: