在这里主要给大家介绍一下如何实现远端映射,在本地终端或vscode链接开发机并执行一系列linux基础操作。
SSH远程链接
powershell远程链接
VScode 远程链接
下载remote -ssh
链接
远程连接完成以后,可以选择打开的文件夹,也可以称为工作目录,你可以选择开发机中的也可以选择本地的,开发机中的文件夹,就是我们前面提到的云盘。
当下一次进行远程连接的时候,就不需要输入登录命令等信息了,只需要打开vscode的远程连接就可以看到第一次连接的开发机信息,下面的root
代表我们第一连接开发机时使用的是/root
工作目录
什么是端口映射
端口映射是一种网络技术,它可以将外网中的任意端口映射到内网中的相应端口,实现内网与外网之间的通信。通过端口映射,可以在外网访问内网中的服务或应用,实现跨越网络的便捷通信。
那么我们使用开发机为什么要进行端口映射呢?
因为在后续的课程中我们会进行模型web_demo的部署实践,那在这个过程中,很有可能遇到web ui加载不全的问题。这是因为开发机Web IDE中运行web_demo时,直接访问开发机内 http/https 服务可能会遇到代理问题,外网链接的ui资源没有被加载完全。
所以为了解决这个问题,我们需要对运行web_demo的连接进行端口映射,将外网链接映射到我们本地主机,我们使用本地连接访问,解决这个代理问题。下面让我们实践一下。
所以为了解决这个问题,我们需要对运行web_demo的连接进行端口映射,将外网链接映射到我们本地主机,我们使用本地连接访问,解决这个代理问题。下面让我们实践一下。
我们先根据一个图了解一下开发机端口映射是如何工作的:
下面会有实践步骤这里先理解如何进行端口映射的
ssh -p 37367 root@ssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyChecking=no
上面是一个端口映射命令,在主机上运行该命令即可进行端口映射,下面用一个流程图了解端口映射的过程:
个人PC会远程连接到开发机唯一暴露在外的37367端口,(这个在SSH的时候提到过每个人的开发机暴露的端口都不一样),并设置隧道选项。暴露端口是作为中转站进行流量的转发。
-
-C
:启用压缩,减少传输数据量。 -
-N
:不执行远程命令,只建立隧道。 -
-g
:允许远程主机连接到本地转发的端口。
当在个人PC上执行这个SSH命令后,SSH客户端会在本地机器的7860端口上监听。
任何发送到本地7860端口的流量,都会被SSH隧道转发到远程服务器的127.0.0.1地址上的7860端口。
这意味着,即使开发机的这个端口没有直接暴露给外部网络,我们也可以通过这个隧道安全地访问远程服务器上的服务。。
如何进行端口映射
使用SSH
1.我们还是来到开发机界面,找到我们的开发机,点击自定义服务,复制第一条命令,
下面给他大家介绍一下命令各部分的含义:
-
-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()
在开发机跑这个python文件
powershell 建立映射(注意端口号 改成自己的)
ssh -p xxxxx root@ssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyChecking=no
成功
使用vscode
当然,如果我们运行不同的web ui的话,需要重复输入命令,这样很麻烦,这就需要用到VScode了。前面我们已经SSH远程连接了开发机,VScode提供了自动端口映射的功能,我们不需要手动配置,我们可以使用“Ctrl+Shift+~”快捷键唤醒终端,在终端的右侧可以找到端口选项:
linux基础命令
3. Linux 基础命令
这一部分我会带着大家了解Linux的一些基础操作,还有使用一些工具。让大家能够在遇到问题的时候,可以自行解决,如果大家有遇到什么问题的话,也可以在这里评论,我会及时给大家回答。
因为我们使用开发机时很少使用到权限管理,所以我们就不介绍了。(后面的操作均在VScode的终端中进行)
3.1 文件管理
在 Linux 中,常见的文件管理操作包括:
-
创建文件:可以使用
touch
命令创建空文件。 -
创建目录:使用
mkdir
命令。 -
目录切换:使用
cd
命令。 -
显示所在目录:使用
pwd
命令。 -
查看文件内容:如使用
cat
直接显示文件全部内容,more
和less
可以分页查看。 -
编辑文件:如
vi
或vim
等编辑器。 -
复制文件:用
cp
命令。 -
创建文件链接:用
ln
命令。 -
移动文件:通过
mv
命令。 -
删除文件:使用
rm
命令。 -
删除目录:
rmdir
(只能删除空目录)或rm -r
(可删除非空目录)。 -
查找文件:可以用
find
命令。 -
查看文件或目录的详细信息:使用
ls
命令,如使用ls -l
查看目录下文件的详细信息。 -
处理文件:进行复杂的文件操作,可以使用
sed
命令。
创建conda环境(VScode)
终端输入 conda create -n name python=3.8
输入activate + name 激活环境
studio-conda使用与Shell(扩展,不需要在开发机中操作)
这一部分属于扩展的部分,因为我觉得这一部分非常有趣,也非常实用,所以如果大家有兴趣的可以学习一下。
我们先来介绍一下studio-conda
,这是开发机内置的一个命令,它通过Shell脚本来实现的。什么是Shell脚本呢?
Shell 脚本 是一种包含一系列命令的文本文件,这些命令按照特定的顺序排列,用于在 Unix/Linux 或类似的操作系统环境中自动执行任务。
Shell 脚本通常使用 Shell 语言编写,常见的 Shell 语言如 Bash、Sh 等,就是我们前面所介绍了Linux基础命令,这就属于Shell语言。
它有以下几个重要特点:
-
自动化:可以将一系列重复、复杂的操作编写为一个脚本,然后只需运行脚本即可自动完成这些操作,从而节省时间和减少错误。例如,每天定时备份重要文件的脚本。
-
系统管理:用于管理系统配置、用户权限、进程控制等。比如,创建新用户并设置其权限的脚本。
-
批处理:能够同时处理多个文件或数据。例如,将一批图片文件从一种格式转换为另一种格式的脚本。
-
流程控制:像条件判断(if-else)、循环(for、while)等,使脚本能够根据不同的情况执行不同的操作。