本文同步到CSDN,为书生大模型实战营的作业记录。
四期飞书文档

开发机的使用

创建开发机

首先注册InternStudio账号,进入控制台:InternStudio

按照教程中的步骤创建开发机(其实一开始不太会用的话,可以选1个小时,我一开始操作失误把一个8h的开发机停止了,痛失8算力🥹)

创建成功后可以在开发机选项卡点击进入开发机,来在Web界面连接开发机,在Web界面我们可以使用以下三种模式:

  • JupyterLab:一个交互式的编程和教学环境,同时内置终端,可以很方便地查看文件,执行代码等
  • 终端(Terminal, 最轻量级):主要进行命令行操作,或者运行脚本和简单程序
  • VSCode:网页中集成的VSCode,也可以在本地VSCode中通过SSH连接远程开发,下面就会讲如何配置远程连接

使用SSH连接开发机

什么是SSH?

SSH全称Secure Shell,中文翻译为安全外壳,它是一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务。SSH 协议通过对网络数据进行加密和验证,在不安全的网络环境中提供了安全的网络服务。

SSH 是(C/S架构)由服务器和客户端组成,为建立安全的 SSH 通道,双方需要先建立 TCP 连接,然后协商使用的版本号和各类算法,并生成相同的会话密钥用于后续的对称加密。在完成用户认证后,双方即可建立会话进行数据交互。

远程连接的好处就是,如果你使用的是远程办公,你可以通过SSH远程连接开发机,这样就可以在本地进行开发。而且如果你需要跑一些本地的代码,又没有环境,那么远程连接就非常有必要了。

在Windows下连接SSH开发机

首先来试用一下通过密码连接,在Windows下打开PowerShell,其实用CMD应该也是可以的,但更多时候,使用Powershell可以实现更加复杂的功能。

然后在Web控制台开发机页点击SSH连接来查看登录命令:(我的开发机在我写这篇文章时已经停机,所以我用教程里的指令来进行详细解释)

1
ssh -p 37367 root@ssh.intern-ai.org.cn -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null

这条 SSH 命令用于通过特定端口远程连接到服务器。以下是每个部分的解释:

  1. ssh:命令行工具,用于通过 SSH(安全外壳)协议连接到远程计算机。

  2. -p 37367:指定使用端口号 37367 进行连接(默认情况下,SSH 使用端口 22)。

  3. root@ssh.intern-ai.org.cn:远程主机信息,root 表示用户名,ssh.intern-ai.org.cn 是远程服务器的地址。

  4. -o StrictHostKeyChecking=no:此选项用于禁用主机密钥检查。如果此项设置为 no,SSH 不会提示用户验证主机的身份,即使密钥未知。

  5. -o UserKnownHostsFile=/dev/null:指定将用户已知的主机密钥文件设置为 /dev/null,即不记录远程主机密钥。这意味着不会保存连接的服务器信息,也不会在未来访问中被使用。

总结:这条命令连接到 ssh.intern-ai.org.cn 服务器的端口 37367,并通过 root 用户进行身份验证。它禁用主机密钥检查,并忽略记录已知的主机密钥,通常用于避免提示或为不受信任的环境创建临时连接。

需要注意的是:

主机密钥检查里的“主机”指的是服务器,而不是你的 PC 端。

当你通过 SSH 连接到一台服务器时,SSH 客户端会从该服务器接收到一个主机密钥,用来验证你正在连接的服务器的身份。
如果是你第一次连接这台服务器,SSH 会提示你是否信任并保存该主机密钥,以便在未来访问时验证服务器的身份。
这一步是为了防止中间人攻击,如果主机密钥发生变化,SSH 会发出警告。
在你的命令中,通过设置 -o StrictHostKeyChecking=no,SSH 跳过了这个验证步骤,因此不会询问你是否信任这台服务器的密钥。

按下enter需要输入密码,这里是可以在控制台复制过来的,不多赘述。回车,出现以下界面说明连接成功:

输入一系列指令来查看开发机信息:

输入两次exit来退出远程连接。

配置SSH密钥进行SSH远程连接

为了使连接更加方便,我们来配置SSH密钥以进行快捷的远程连接。
(这里如果用户名含中文,将无法支持,但还好我的是数字)
ssh-keygen支持RSA和DSA两种认证密钥。

常用参数包括:

-t:指定密钥类型,如dsa、ecdsa、ed25519、rsa。
-b:指定密钥长度。
-C:添加注释。
-f:指定保存密钥的文件名。
-i:读取未加密的ssh-v2兼容的私钥/公钥文件。
这里我们使用RSA算法生成密钥,命令为:

1
ssh-keygen -t rsa

有些同学可能之前配置过(比如我),就可以在用户文件夹下找到这个密钥,路径:

1
C:/Users/{用户名}/.ssh/id_rsa.pub

在powerShell中可以使用Get-Content命令查看生成的密钥:

但我后面发现,即便直接用txt打开也可以复制到这部分内容(doge)。

然后我们回到开发机平台,在首页点击配置SSH Key,接着点击添加SSH公钥,将刚刚生成的密钥复制下来,粘贴到公钥框中,名称会被自动识别到,最后点击立即添加,SSH Key就配置完成了。

重启终端进行远程连接,就会跳过密码输入这一步了。

使用vscode进行SSH远程连接

首先需要下载下图中的插件们:

安装完成插件以后,点击侧边栏的远程连接图标,在SSH中点击“+”按钮,添加开发机SSH连接的登录命令。
后面的一系列操作直接按照默认执行即可。

然后点击弹出的“已添加主机”窗口的连接,就可以远程使用开发机了。

端口映射

什么是端口映射?

端口映射是一种网络技术,它可以将外网中的任意端口映射到内网中的相应端口,实现内网与外网之间的通信。通过端口映射,可以在外网访问内网中的服务或应用,实现跨越网络的便捷通信。

在后续的课程中我们会进行模型web_demo的部署实践,那在这个过程中,很有可能遇到web ui加载不全的问题。这是因为开发机Web IDE中运行web_demo时,直接访问开发机内 http/https 服务可能会遇到代理问题,外网链接的ui资源没有被加载完全。

为了解决这个问题,我们需要对运行web_demo的连接进行端口映射,将外网链接映射到我们本地主机,我们使用本地连接访问,解决这个代理问题。

如何进行端口映射

在开发机选项卡,点击自定义服务,复制第一条命令(这里实际上是第二条也行,除非你机器上的7860端口已经被使用了,127.0.0.1对应的是本地机,localhost等同于127.0.0.1,区别在于localhost是域名,127.0.0.1是IP地址,它们都是本机访问,访问时都不需要联网)

1
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:关闭严格的主机密钥检查,这样可以避免第一次连接时因为未知主机密钥而产生的提示或错误。

然后用上面所教的任意一种方法连接开发机,然后在一个你能控制的目录下创建hello_world.py(注意这里不要在share文件夹下创建因为他是只读的,会写入失败):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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/202410081252022.png" alt="Logo" width="50%" style="border-radius: 5px;">
</a>
</p>

"""
gr.Markdown(html_code)

demo.launch()

在运行代码之前,需要先使用pip install gradio==4.29.0命令安装依赖包,并在本机PC端的Powershell中运行:

1
ssh -p 37367 root@ssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyChecking=no

然后在Web IDE的终端中运行hello_world.py:

1
python hello_world.py

看到如下界面:

就可以在浏览器中通过127.0.0.1:7860来访问界面:

映射成功

Linux入门指令

Linux在入门使用的时候最常用的就是下面几个:

  • pwd: 查看当前目录
  • cd: 切换路径(change directory)
    • cd ..:切换到上一级目录(相对路径)
    • cd /home:切换到home目录(绝对路径)
  • ls: 打印当前目录下所有的内容(文件夹和文件颜色是不一样的)
  • mkdir: 创建文件夹,在后面跟文件夹名,如果文件夹名中含空格,需要带引号
    • mkdir "dir name"
  • touch: 创建文件,在后面跟文件名,要带后缀,如果含空格与上一条同理
    • touch hello_world.py
  • cat: 查看文件内容,在后面跟文件名,将文件内容打印在终端。
  • vi: 使用vim编辑器创建(如果没有这个文件)并打开文件,进行编辑:
    • 编辑模式有多种,教程很多,我这里肯定说不清楚,事实上我掌握的也只是最基础的功能,建议是不会就去google,越用越熟吧
  • rm: 删除一个文件
    • rm hello.py
  • rm -r: 递归删除一个文件夹
    • rm -r "dir name"
  • grep: 跟一个字符串, 筛选出含有这个字符串的内容
    • grep "hello" file.txt
  • >: 将输出写入文件,覆盖原有内容
    • python hello.py > output.txt
  • >>: 将输出写入文件,追加到原有内容后面
    • python hello.py >> output.txt
  • |: 管道操作符,用于将一个命令的输出传递给另一个命令
    • python hello.py | grep "Hello"

参考材料

https://github.com/InternLM/Tutorial/tree/camp4/docs/L0/linux
PowerShell和cmd的区别是什么