前言:书生大模型实战营是上海人工智能实验室开展的大模型系列实践活动,提供免费算力平台,学员通过闯关式任务,可获得免费算力和存储,助力项目实践。本期是第4期,时间从十一月份开始,持续到十二月底,本期我作为学习者,同时也是9班的助教,将此次实战营相关任务教程文档整理成笔记,记录自己在实践过程中的心得与收获,以及相关知识点讲解。
官方教程可参考:Tutorial/docs/L0/linux/readme.md at camp4 · InternLM/Tutorial
1.关卡任务介绍:
本关是入门岛的第一关,主题是Linux基础知识,闯关任务要求如下:
2.SSH和端口映射介绍
InternStudio 是本次实战营官方提供的云端算力平台,教程教程里面有详细的介绍,在此略去。
2.1 .SSH和远程连接
SSH(Secure Shell)是一种加密的安全协议,用于在不安全的网络上安全地进行远程登录、文件传输和命令执行。SSH 提供了端到端的加密通信,确保数据在传输过程中不会被窃听或篡改。它广泛应用于系统管理员、开发人员和其他需要远程管理服务器或开发环境的用户。
SSH 的主要特点:
-
加密通信:SSH 使用对称加密、非对称加密和哈希算法来保护数据的安全性。
-
身份验证:支持多种身份验证方式,如密码、公钥/私钥对、双因素认证等。
-
隧道功能:可以通过 SSH 隧道转发其他协议的流量,实现安全的远程访问。
-
命令执行:可以在远程服务器上执行命令,类似于本地终端操作。
远程连接允许用户通过网络从一台计算机连接到另一台计算机,从而实现远程管理和操作。远程连接通常使用加密协议(如 SSH),确保通信的安全性,防止敏感信息泄露。
2.2.如何使用 SSH 远程连接开发机
首先我们创建一个开发机,这里我已经在InternStudio平台创建好了一个名为C41的开发机,然后我们点击开发机操作界面的“SSH连接”,就会出现一个小窗口,如下:
然后我们"windows+R"打开本地的命令行,输入复制的登陆命令即可,提示需要输入密码,然后复制密码并输入按Enter即可。注意:命令行输入的密码不会显示出来。
因为我之前已经配置过SSH密钥,所以不用输入密码,就可以直接连上开发机,开发机界面如下:
我们可以使用nvidia-smi
查看GPU的信息,如下:
我们可以输入两次exit命令来退出SSH连接。
配置SSH密钥连接:
每次登录都要输入密码很麻烦,我们可以配置SSH密钥连接,这样就不需要每次登录都输入密码啦。是不是方便很多呢?
我们可以使用RSA算法来生成密钥,命令为:ssh-keygen -t rsa,一路enter即可,轻松愉快。
ssh-keygen -t rsa
生成密钥后,我们看到密钥保存在C:\Users\{your_username}/.ssh/id_rsa.pub
我们使用在powerShell中可以使用Get-Content
命令查看生成的密钥。
接着回到开发机,我们点开添加公钥。输入刚刚复制的公钥值即可,名称会自动生成。
这样我们下次再登录就不用输入密码啦,撒花*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。
2.3.使用VSCode远程连接开发机
接下来我们演示一下,如何使用VSCode远程连接开发机。
VSCode是由微软开发的一款免费、开源的代码编辑器,适用于多种编程语言和开发任务。VSCode 以其轻量级、高度可扩展性和丰富的功能而广受欢迎。使用VSCode远程连接到开发机是一种非常方便的方式来管理和编辑远程服务器上的文件。
操作流程:
首先在扩展插件里面输入ssh,搜索找到Remote-SSH插件并安装。
安装完成后,点击侧边栏的远程连接图标,在SSH中点击“+”按钮,添加开发机SSH连接的登录命令。因为前面已经配置过密钥,所以这次不需要再次输入密码了。
我们将登录命令复制下来,然后将命令粘贴到弹出的窗口中,最后回车。然后在右下角弹出来的提示窗口中点击“连接”就可以远程到开发机中了。
安装完成后,点击侧边栏的远程连接图标,在SSH中点击“+”按钮,添加开发机SSH连接的登录命令。因为前面已经配置过密钥,所以这次不需要再次输入密码了。
我们将登录命令复制下来,然后将命令粘贴到弹出的窗口中,最后回车。然后在右下角弹出来的提示窗口中点击“连接”就可以远程到开发机中了。
连接完成后如下:
2.4.端口映射
端口映射 是一种网络技术,用于将一个设备上的端口(通常是主机)映射到另一个设备上的端口(通常是容器、虚拟机或远程服务器)。通过端口映射,你可以将外部流量转发到内部服务,或者将内部服务暴露给外部网络。
端口映射操作:接下来我们进行端口映射操作,在开发机页面,点开自定义服务,复制图中命令,然后本地PC输入指令:
ssh -p 41837 root@ssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyChecking=no
端口映射命令解析:
-
ssh
:启动 SSH 客户端,用于建立与远程服务器的安全连接。 -
-p 41837
:指定 SSH 连接的端口号。每个人的开发机有不同的暴露端口,这里使用的是 41837。 -
root@ssh.intern-ai.org.cn
:指定要连接的远程服务器的用户名(root
)和主机名(ssh.intern-ai.org.cn
)。 -
-C
:启用压缩,减少传输数据量,特别适用于带宽较低或延迟较高的网络环境。 -
-N
:不执行远程命令,只建立隧道。这意味着 SSH 连接不会启动任何远程 shell 或命令,仅用于端口转发。 -
-g
:允许远程主机连接到本地转发的端口。默认情况下,只有本地机器可以连接到转发的端口,使用-g
选项后,其他远程主机也可以连接。 -
-L 7860:127.0.0.1:7860
:这是关键的端口映射部分:-
7860
:本地机器上监听的端口号。任何发送到本地 7860 端口的流量都会被转发。 -
127.0.0.1:7860
:远程服务器上的目标地址和端口号。这里的127.0.0.1
表示远程服务器本身,7860
是远程服务器上运行的 Web 服务的端口。
-
-
-o StrictHostKeyChecking=no
:禁用严格的主机密钥检查。这会自动接受新的主机密钥,避免手动确认,特别适合自动化脚本或频繁连接的场景。
我们举一个WebDemo的例子,我们在开发机创建一个helloworld.py文件。
输入以下内容:
这里我们用到了socket库和gradio库,如果没有安装,需要先行安装一下。
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()
我们在开发机运行这个文件:
我们点击这个URL:http://127.0.0.0:7860。
在没有做端口映射的情况下是没法打开的。如下图:
然后我们做一下端口映射,再次打开就可以正确显示页面了,是不是很神奇。
使用VSCode进行端口映射
前面我们已经SSH远程连接了开发机,VScode提供了自动端口映射的功能,我们不需要手动配置,我们可以使用“Ctrl+Shift+~”快捷键唤醒终端,在终端的右侧可以找到端口选项:
3.Linux基础命令
Linux 是一个开源的、基于 Unix 的操作系统内核,广泛用于服务器、嵌入式系统和个人计算机。它以其稳定性、安全性和灵活性著称,支持多种硬件平台和丰富的软件生态系统。
3.1.文件管理
在 Linux 中,常见的文件管理操作包括:
-
创建文件:可以使用
touch
命令创建空文件。 -
创建目录:使用
mkdir
命令。 -
目录切换:使用
cd
命令。 -
显示所在目录:使用
pwd
命令。 -
查看文件内容:如使用
cat
直接显示文件全部内容,more
和less
可以分页查看。 -
复制文件:用
cp
命令。 -
创建文件链接:用
ln
命令。 -
移动文件:通过
mv
命令。 -
删除文件:使用
rm
命令。 -
删除目录:
rmdir
(只能删除空目录)或rm -r
(可删除非空目录)。 -
查找文件:可以用
find
命令。 -
查看文件或目录的详细信息:使用
ls
命令,如使用ls -l
查看目录下文件的详细信息。
在这里我们主要介绍几种课程中会用到的常用命令,更多的Linux命令,感兴趣的同学可自行研究。
列出目录内容:ls
ls
是用于列出目录内容的命令。它可以帮助你查看当前或指定目录中的文件和子目录。
-
ls
:列出当前目录的内容。 -
ls -l
:以长格式列出文件的详细信息(包括权限、所有者、大小、修改时间等)。 -
ls -a
:列出所有文件,包括隐藏文件(以.
开头的文件)。 -
ls -la
或ls -al
:结合-l
和-a
,列出所有文件的详细信息,包括隐藏文件。 -
ls -h
:以人类可读的格式显示文件大小(如 KB、MB)。 -
ls -R
:递归列出目录及其子目录的内容。
改变当前目录:cd
cd
(Change Directory)用于切换当前工作目录。
-
cd /path/to/directory
:进入指定的目录。 -
cd ..
:返回上一级目录。 -
cd ~
或cd
:返回用户的主目录。 -
cd -
:返回上一次所在的目录。
显示当前工作目录:pwd
pwd
(Print Working Directory)用于显示当前所在目录的完整路径。
创建新目录:mkdir
mkdir
用于创建新的目录。
-
mkdir directory_name
:创建一个名为directory_name
的新目录。 -
mkdir -p path/to/directory
:递归创建多个层级的目录(如果父目录不存在,会自动创建)。
删除文件或目录:rm
rm
用于删除文件或目录。使用时要小心,删除的操作是不可逆的。
-
rm file_name
:删除单个文件。 -
rm -r directory_name
:递归删除目录及其所有内容。 -
rm -rf directory_name
:强制递归删除目录及其所有内容,不提示确认(危险操作,谨慎使用)。
复制文件或目录:cp
cp
用于复制文件或目录。
-
cp source destination
:将source
文件复制到destination
。 -
cp -r source_directory destination_directory
:递归复制整个目录及其内容。 -
cp -i source destination
:在覆盖文件时提示确认(避免误操作)
创建文件链接:ln(重要)
ln
命令用于创建文件或目录的链接(也称为符号链接或硬链接)。
硬链接是指向同一 inode(索引节点)的多个文件名。每个硬链接都是文件的实际副本,但它们共享相同的文件数据。删除一个硬链接不会影响其他硬链接,只有当所有硬链接都被删除时,文件数据才会被真正删除。
符号链接(软链接)是一个特殊的文件,它包含指向另一个文件或目录的路径。符号链接与硬链接不同,它并不直接指向文件的数据,而是通过路径来引用目标文件。如果目标文件被删除,符号链接将变成“悬空链接”(即无效链接)。
移动文件或目录:mv
mv
用于移动文件或目录,也可以用于重命名文件或目录。
-
mv old_name new_name
:重命名文件或目录。 -
mv file_or_directory destination
:将文件或目录移动到目标位置。
创建空文件:touch(重要)
touch
用于创建空文件,或者更新现有文件的时间戳。
-
touch file_name
:创建一个名为file_name
的空文件。 -
touch -t YYYYMMDDHHMM.SS file_name
:设置文件的时间戳为指定的时间。
查看文件内容:cat,less,head,tail
-
cat file_name
:显示文件的全部内容。 -
less file_name
:分页查看文件内容,适合查看大文件。 -
head -n N file_name
:显示文件的前 N 行。 -
tail -n N file_name
:显示文件的最后 N 行。
查找文件:find
, locate
-
find /path/to/search -name "filename"
:在指定路径下查找名为filename
的文件。 -
find . -type f -name "*.txt"
:查找当前目录下的所有.txt
文件。 -
locate filename
:快速查找文件(需要预先建立数据库,使用updatedb
更新)。
压缩与解压缩文件:tar
, gzip
, zip
, unzip
-
tar -cvf archive.tar /path/to/directory
:创建 tar 归档。 -
tar -xvf archive.tar
:解压 tar 归档。 -
tar -czvf archive.tar.gz /path/to/directory
:创建 gzip 压缩的 tar 归档。 -
tar -xzvf archive.tar.gz
:解压 gzip 压缩的 tar 归档。 -
gzip file_name
:压缩文件并删除原文件。 -
gunzip file_name.gz
:解压文件。 -
zip -r archive.zip /path/to/directory
:创建 zip 归档。 -
unzip archive.zip
:解压 zip 归档。
查看文件类型:file
file
用于查看文件的类型,而不仅仅是根据文件扩展名。
3.2.进程管理
进程管理命令是进行系统监控和进程管理时的重要工具,常用的进程管理命令有以下几种:
-
ps:查看正在运行的进程
-
top:动态显示正在运行的进程
-
pstree:树状查看正在运行的进程
-
pgrep:用于查找进程
-
nice:更改进程的优先级
-
jobs:显示进程的相关信息
-
bg 和 fg:将进程调入后台
-
kill:杀死进程
ps
- 显示当前进程状态
ps
命令用于显示当前系统中运行的进程信息。它可以显示不同用户、不同终端或整个系统的进程。
top
- 实时显示系统资源和进程状态
top
是一个交互式的命令行工具,实时显示系统的 CPU、内存使用情况以及当前运行的进程。它可以帮助你监控系统性能并识别占用资源较多的进程。
kill
- 终止进程(重要)
kill
命令用于向进程发送信号,默认情况下发送的是 SIGTERM
信号,请求进程正常终止。如果进程不响应 SIGTERM
,可以使用 -9
选项发送 SIGKILL
信号强制终止进程。
-
kill PID
:向指定的进程 ID 发送SIGTERM
信号。 -
kill -9 PID
:向指定的进程 ID 发送SIGKILL
信号,强制终止进程。 -
killall process_name
:终止所有名为process_name
的进程。
nvidia-smi(重要)
在开发机中还有一条特殊的命令nvidia-smi
,它是 NVIDIA 系统管理接口(NVIDIA System Management Interface)的命令行工具,用于监控和管理 NVIDIA GPU 设备。它提供了一种快速查看 GPU 状态、使用情况、温度、内存使用情况、电源使用情况以及运行在 GPU 上的进程等信息的方法。
4.Conda和Shell介绍(简要介绍)
4.1.conda
Conda 是一个开源的包管理和环境管理系统,可在 Windows、macOS 和 Linux 上运行。它快速安装、运行和更新软件包及其依赖项。使用 Conda,您可以轻松在本地计算机上创建、保存、加载和切换不同的环境。
常见conda命令:
创建一个新的 Conda 环境,并指定 Python 版本(可选):
conda create --name myenv python=3.9
激活一个 Conda 环境:
conda activate myenv
退出当前激活的环境:
conda deactivate
查看系统中所有的 Conda 环境:
conda env list # 或 conda info --envs
删除指定的 Conda 环境:
conda env remove --name myenv
在当前激活的环境中安装包:
conda install package_name
从特定渠道安装包:
conda install -c conda-forge package_name
更新指定的包到最新版本:
conda update package_name
卸载指定的包:
conda remove package_name
搜索可用的包:
conda search package_name
4.2.shell
Shell 是操作系统的命令行解释器,它提供了一个用户与操作系统交互的界面。通过 Shell,用户可以输入命令来执行各种任务,如文件管理、进程控制、脚本编写等。
Shell 的主要功能:
- 命令执行:用户可以通过 Shell 输入命令来执行各种操作,如启动程序、管理文件、查看系统信息等。
- 脚本编写:Shell 支持编写脚本(shell scripts),将多个命令组合成一个可执行的文件,实现自动化任务。
- 环境变量管理:Shell 允许用户设置和管理环境变量,这些变量可以影响程序的行为和配置。
- 管道和重定向:Shell 支持将一个命令的输出作为另一个命令的输入(管道),或者将输出重定向到文件中。
- 作业控制:Shell 提供了进程管理功能,用户可以启动、暂停、恢复和终止进程。
4.3.总结
-
Conda 是一个强大的包管理和环境管理工具,特别适合处理复杂的依赖关系和多语言项目。它可以帮助你轻松创建和管理独立的虚拟环境,确保项目的依赖项不会相互冲突。
-
Shell 是操作系统的命令行解释器,提供了与操作系统交互的界面。通过 Shell,你可以执行各种命令、编写脚本、管理文件和进程。常见的 Shell 有 Bash、Zsh、Fish 等,每种 Shell 都有其独特的特性和优势。
5.后记
本章任务就到这里结束了,看完感觉完全不够的小伙伴可以自行查找更多的学习内容,研究端口映射和Linux基础命令更高阶的知识,生命不息,学习不止。
那么,最后,动动你的小手,点赞收藏关注吧,在此拜谢!