一、关卡任务
任务描述 | 完成时间 | |
闯关任务 | 完成SSH连接与端口映射并运行hello_world.py | 10min |
可选任务 1 | 将Linux基础命令在开发机上完成一遍 | 10min |
可选任务 2 | 使用 VSCODE 远程连接开发机并创建一个conda环境 | 10min |
可选任务 3 | 创建并运行test.sh 文件 | 10min |
二、实验过程
2.1 创建开发机
2.2 本地生成 SSH Key
在终端中,运行以下命令来生成SSH密钥对:
ssh-keygen
2.3 在 InternStudio 配置公钥
将刚刚生成的公钥复制到 InternStudio,公钥默认存储在
~/.ssh/id_rsa.pub
,可以通过系统自带的 cat
工具查看文件内容:
cat ~\.ssh\id_rsa.pub
将 SSH 公钥复制到 InternStudio,此公钥是所有开发机共用的,本地机器不变的情况下配置一次即可。换句话说,如果换了一台电脑连接开发机需要再配置一次公钥。
2.4 使用本地机器 SSH 连接开发机
进入开发机列表,查看 ssh 命令 (端口、用户名、IP)
使用 VSCode Remote-SSH 插件连接开发机,首次连接成功后需要等待一段时间,用于将本地的插件、配置等同步至开发机 (~/.vscode
文件夹)
成功连接到远程服务器~
2.5 端口映射
端口映射是一种网络技术,它可以将外网中的任意端口映射到内网中的相应端口,实现内网与外网之间的通信。通过端口映射,可以在外网访问内网中的服务或应用,实现跨越网络的便捷通信。
那么我们使用开发机为什么要进行端口映射呢?
因为在后续的课程中我们会进行模型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
下面介绍一下命令各部分的含义:
-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
:关闭严格的主机密钥检查,这样可以避免第一次连接时因为未知主机密钥而产生的提示或错误。
当运行一个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()
在运行代码之前,需要先使用pip install gradio==4.29.0
命令安装以下依赖包,然后在Web IDE的终端中运行了一个hello_world.py
没有端口映射之前,无法访问Web应用:
端口映射后:
2.6 linux基础命令
2.6.1 touch
可以使用touch快速的创建文件,这样我们不用手动点击进行创建了。例如我们要创建一个demo.py
文件:
touch demo.py
2.6.2 mkdir
同样的使用方法,如果要创建一个名为test
的目录:
mkdir test
2.6.3 cd
cd test
2.6.4 pwd
可以使用pwd
命令查看当前所在的目录:这样可以方便我们确定我们当前所在哪个目录下面。
2.6.5 cp 和 ln
cp
命令在后面课程中会经常用到,它是用来将一个文件或者目录复制到另一个目录下的操作,常用的使用有:
- 复制文件:
cp 源文件 目标文件
- 复制目录:
cp -r 源目录 目标目录
但是如果我们是要使用模型的话,这种操作会占用大量的磁盘空间,所以我们一般使用ln
命令,这个就和windows的快捷方式一样。linux中链接分为两种 : 硬链接(hard link)与软链接(symbolic link),硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。
2.6.6 mv
mv
命令和rm
命令的使用方式很相似,但是mv
是用来移动文件或者目录的,同时还可以进行重命名。rm
命令则是用来删除文件或者目录的。
常用的使用方法如下:
- mv 命令:
常用参数:
-i
:交互模式,覆盖前询问。-f
:强制覆盖。-u
:只在源文件比目标文件新时才进行移动。
使用示例:
mv file1.txt dir1/
:将文件file1.txt
移动到目录dir1
中。mv file1.txt file2.txt
:将文件file1.txt
重命名为file2.txt
。rm 命令:
常用参数:
-i
:交互模式,删除前询问。-f
:强制删除,忽略不存在的文件,不提示确认。-r
:递归删除目录及其内容。
使用示例:
rm file.txt
:删除文件file.txt
。rm -r dir1/
:递归删除目录dir1
及其所有内容。
删除目录的命令也可以使用rmdir
。
2.7 使用 VSCODE 远程连接开发机并创建一个conda环境
使用conda --version
来查看当前开发机中conda
的版本信息:
2.7.1 创建虚拟环境
conda create -n cjy python=3.8
2.7.2 查看有哪些虚拟环境
conda env list
2.7.3 激活与退出虚拟环境
conda activate cjy # 进入环境 conda deactivate cjy # 退出环境