Linux基础知识 - 第四期书生大模型实战营

InternStudio介绍

InternStudio 是大模型时代下的云端算力平台。基于 InternLM 组织下的诸多算法库支持,为开发者提供开箱即用的大语言模型微调环境、工具、数据集,并完美兼容 🤗 HugginFace 开源生态。
如果大家想了解更多关于InternStduio的介绍的话可以查看下面的文档: https://aicarrier.feishu.cn/wiki/GQ1Qwxb3UiQuewk8BVLcuyiEnHe

https://studio.intern-ai.org.cn/

任务一 :完成SSH连接与端口映射并运行hello_world.py

step1:创建开发机

https://studio.intern-ai.org.cn/console/instance/
在这里插入图片描述

step2:vscode连接远程服务器

  1. 进入SSH连接:
    ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/49691606e64c4acba61ead5fef6ab51c.png
    在这里插入图片描述
    打开vscode,下载remote ssh
    在这里插入图片描述
  2. 在vscode中,输入登录命令和密码进行连接
    在这里插入图片描述
    在这里插入图片描述3. 配置SSH密钥进行SSH远程连接(可选)(添加公钥,下次进行连接时,不需要输入密码,更加方便)

但是在我们开发学习的时候,每次远程都输入密码比较麻烦,我们可以设置SSH key来跳过输入密码这一步骤,在ssh命令中我们可以使用ssh-keygen命令来生成密钥
如果大家计算机的用户名是中文的,InternStudio会识别不了,这种情况就需要用密码来登录SSH,不过不影响使用,大家不用担心。
SSH密钥是一种安全便捷的登录认证方式,用于在SSH协议中进行身份验证和加密通信。

ssh-keygen支持RSA和DSA两种认证密钥。

常用参数包括:

-t:指定密钥类型,如dsa、ecdsa、ed25519、rsa。
-b:指定密钥长度。
-C:添加注释。
-f:指定保存密钥的文件名。
-i:读取未加密的ssh-v2兼容的私钥/公钥文件。

这里我们使用RSA算法生成密钥,命令为:

ssh-keygen -t rsa

在这里插入图片描述
4. 然后我们回到开发机平台,在首页点击配置SSH Key,接着点击添加SSH公钥,名称自拟
在这里插入图片描述
至此已经完成,vscode远程连接SSH

step3:端口映射

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

那么我们使用开发机为什么要进行端口映射呢?

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

所以为了解决这个问题,我们需要对运行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 命令进行端口映射

我们还是来到开发机界面,找到我们的开发机,点击自定义服务,复制第一条命令,
在这里插入图片描述

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/202410081252022.png" alt="Logo" width="50%" style="border-radius: 5px;">
                </a>
            </p>

            """
    gr.Markdown(html_code)

demo.launch()

在运行代码之前,需要先使用pip install gradio==4.29.0命令安装以下依赖包,然后在Web IDE的终端中运行了一个hello_world.py

如果不进行端口映射的话,使用本地IP是访问不了的

我可以使用下面的命令,将它输入到powerShell中:

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

在这里插入图片描述

这样就代表成功了。(注意:这个命令不返回任何的内容,这样代表端口映射在运行了,然后在网页中打开连接就可以看到web ui的界面了)
在这里插入图片描述

使用vscode进行端口映射

当然,如果我们运行不同的web ui的话,需要重复输入命令,这样很麻烦,这就需要用到VScode了。前面我们已经SSH远程连接了开发机,VScode提供了自动端口映射的功能,我们不需要手动配置,我们可以使用“Ctrl+Shift+~”快捷键唤醒终端,在终端的右侧可以找到端口选项:
在这里插入图片描述
在这里可以查看端口映射的信息,如果需要修改端口的话,可以在端口那一栏修改端口号。

任务二:将Linux基础命令在开发机上完成一遍

文件管理

在 Linux 中,常见的文件管理操作包括:

  • 创建文件:可以使用 touch 命令创建空文件。
  • 创建目录:使用 mkdir 命令。
  • 目录切换:使用cd命令。
  • 显示所在目录:使用pwd命令。
  • 查看文件内容:如使用 cat 直接显示文件全部内容,more 和 less 可以分页查看。
  • 编辑文件:如 vi 或 vim 等编辑器。
  • 复制文件:用 cp 命令。
  • 创建文件链接:用ln命令。
  • 移动文件:通过 mv 命令。
  • 删除文件:使用 rm 命令。
  • 删除目录:rmdir(只能删除空目录)或 rm -r(可删除非空目录)。
  • 查找文件:可以用 find 命令。
  • 查看文件或目录的详细信息:使用ls命令,如使用 ls -l查看目录下文件的详细信息。
  • 处理文件:进行复杂的文件操作,可以使用sed命令。
    这里介绍几种我们在课程中会使用到的命令:
touch

我们可以使用touch快速的创建文件,这样我们不用手动点击进行创建了。例如我们要创建一个demo.py文件:

touch demo.py
mkdir

同样的使用方法,如果要创建一个名为test的目录:

mkdir test

在这里插入图片描述

cd

这个命令会是使用最多的一个命令,在使用之前需要为没有计算机基础的同学讲一下目录结构,画一张图让大家理解:

image

我们现在使用的是root目录,也是root用户的家目录~,linux操作系统中/表示根目录,根目录下有许多系统所需的目录和文件,刚才我们创建的目录就存在与root目录下,其中.表示的是当前目录,…表示的上级目录。如果我现在要进入到test目录,然后回到root目录,我们可以这样操作:

cd test
pwd

我们可以使用pwd命令查看当前所在的目录:这样可以方便我们确定我们当前所在哪个目录下面。

pwd

在这里插入图片描述

cat

cat命令可以查看文件里面的内容,更多的使用命令可以使用–help命令查看:

  • -a,–show-all等价于-vET
  • -b,–number-non空白数非空输出行,覆盖-n
  • -e, 等价于-vE
  • -E,–show-结束显示$在每一行的末尾
  • -n,–number编号所有输出行
  • -s,–crick-空白抑制重复的空输出行
  • -t等价于-vT
  • -t,–show-tabs将制表符显示为^I
  • -v,–show非打印使用^和M-表示法,LFD和TAB除外
vi or vim

当我们需要编辑文件的时候可以使用vi或者vim命令,当你进入文件编辑以后,有三种模式:
在这里插入图片描述

cp和ln(重点)

cp命令在后面课程中会经常用到,它是用来将一个文件或者目录复制到另一个目录下的操作,常用的使用有:

  • 复制文件:cp 源文件 目标文件
  • 复制目录:cp -r 源目录 目标目录
    在这里插入图片描述
    但是如果我们是要使用模型的话,这种操作会占用大量的磁盘空间,所以我们一般使用ln命令,这个就和windows的快捷方式一样。linux中链接分为两种 : 硬链接(hard link)与软链接(symbolic link),硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。
    所以我们一般使用软连接,它的常用的使用方法如下:
ln [参数][源文件或目录][目标文件或目录]

参数如下:

  • -s:创建软链接(符号链接)也是最常用的;
  • -f:强制执行,覆盖已存在的目标文件;
  • -i:交互模式,文件存在则提示用户是否覆盖;
  • -n:把符号链接视为一般目录;
  • -v:显示详细的处理过程。
mv 和 rm

mv命令和rm命令的使用方式很相似,但是mv是用来移动文件或者目录的,同时还可以进行重命名。rm命令则是用来删除文件或者目录的。
常用的使用方法如下:

mv 命令:
常用参数:

  • -i:交互模式,覆盖前询问。
  • -f:强制覆盖。
  • -u:只在源文件比目标文件新时才进行移动。

rm 命令:

常用参数:

  • -i:交互模式,删除前询问。
  • -f:强制删除,忽略不存在的文件,不提示确认。
  • -r:递归删除目录及其内容。

在这里插入图片描述

删除目录的命令也可以使用rmdir。

find

find命令是Linux系统中一个强大的文件搜索工具,它可以在指定的目录及其子目录中查找符合条件的文件或目录,并执行相应的操作。

以下是find命令的一些常见用法:

  • 按文件名查找:使用-name选项按照文件名查找文件。例如,find /path/to/directory -name "file.txt"将在指定目录及其子目录中查找名为file.txt的文件。
  • 按文件类型查找:使用-type选项按照文件类型查找文件。例如,find /path/to/directory -type f将查找指定目录及其子目录中的所有普通文件。
  • 按文件大小查找:使用-size选项按照文件大小查找文件。例如,find /path/to/directory -size +100M将查找指定目录及其子目录中大于100MB的文件。
  • 按修改时间查找:使用-mtime、-atime或-ctime选项按照文件的修改时间、访问时间或状态更改时间查找文件。例如,find /path/to/directory -mtime -7将查找指定目录及其子目录中在7天内修改过的文件。
  • 按文件权限查找:使用-perm选项按照文件权限查找文件。例如,find /path/to/directory -perm 755将查找指定目录及其子目录中权限为755的文件。
  • 按用户或组查找:使用-user或-group选项按照文件的所有者或所属组查找文件。例如,find /path/to/directory -user username将查找指定目录及其子目录中属于用户username的文件。
  • 执行操作:使用-exec选项可以对找到的文件执行相应的操作。例如,find /path/to/directory -name “*.txt” -exec rm {} ;将删除找到的所有以.txt结尾的文件。
ls

ls命令可以用来列出目录的内容以及详细信息。

常用参数及使用方法如下:

  • -a:显示所有文件和目录,包括隐藏文件(以.开头的文件或目录)。
  • -l:以长格式显示详细信息,包括文件权限、所有者、大小、修改时间等。
  • -h:与-l结合使用,以人类可读的方式显示文件大小(如K、M、G等)。
  • -R:递归列出子目录的内容。
  • -t:按文件修改时间排序显示。
sed

sed命令是一种流编辑器,主要用于文本处理,在处理复杂的文件操作时经常用到,在后续的课程中会使用到,sed命令常用参数如下:
在这里插入图片描述
在这里插入图片描述

在示例中使用了echo命令,这和python中的print一样,用来打印内容,这里使用管道符>将InternLM打印到file文件中,常用的管道符还有<和|,比如我们可以使用grep命令来查看python中安装的包含os字段的包:

grep是一个强大的文本搜索工具。常用参数如下:

  • -i:忽略大小写进行搜索。
  • -v:反转匹配,即显示不匹配的行。
  • -n:显示行号。
  • -c:统计匹配的行数。
    在这里插入图片描述

进程管理

进程管理命令是进行系统监控和进程管理时的重要工具,常用的进程管理命令有以下几种:

  • ps:查看正在运行的进程
  • top:动态显示正在运行的进程
  • pstree:树状查看正在运行的进程
  • pgrep:用于查找进程
  • nice:更改进程的优先级
  • jobs:显示进程的相关信息
  • bg 和 fg:将进程调入后台
  • kill:杀死进程

在开发机中还有一条特殊的命令nvidia-smi,它是 NVIDIA 系统管理接口(NVIDIA System Management Interface)的命令行工具,用于监控和管理 NVIDIA GPU 设备。它提供了一种快速查看 GPU 状态、使用情况、温度、内存使用情况、电源使用情况以及运行在 GPU 上的进程等信息的方法。

ps

下面是关于各个命令使用示例:

  • ps:列出当前系统中的进程。使用不同的选项可以显示不同的进程信息,例如:
ps aux  # 显示系统所有进程的详细信息

在这里插入图片描述

top
  • top:动态显示系统中进程的状态。它会实时更新进程列表,显示CPU和内存使用率最高的进程。
top  # 启动top命令,动态显示进程信息
pstree
  • pstree:以树状图的形式显示当前运行的进程及其父子关系。
pstree  # 显示进程树
psgrep
  • pgrep:查找匹配条件的进程。可以根据进程名、用户等条件查找进程。
pgrep -u username  # 查找特定用户的所有进程

在这里插入图片描述

nice
  • nice:更改进程的优先级。nice 值越低,进程优先级越高。
nice -n 10 long-running-command  # 以较低优先级运行一个长时间运行的命令
jobs

jobs:显示当前终端会话中的作业列表,包括后台运行的进程。

jobs  # 列出当前会话的后台作业

在这里插入图片描述

bg nad fg
  • bg 和 fg:bg 将挂起的进程放到后台运行,fg 将后台进程调回前台运行。
bg  # 将最近一个挂起的作业放到后台运行
fg  # 将后台作业调到前台运行
kill
  • kill:发送信号到指定的进程,通常用于杀死进程。
kill PID  # 杀死指定的进程ID

注意,kill 命令默认发送 SIGTERM 信号,如果进程没有响应,可以使用-9使用SIGKILL 信号强制杀死进程:

kill -9 PID  # 强制杀死进程    

SIGTERM(Signal Termination)信号是Unix和类Unix操作系统中用于请求进程终止的标准信号。当系统或用户想要优雅地关闭一个进程时,通常会发送这个信号。与SIGKILL信号不同,SIGTERM信号可以被进程捕获并处理,从而允许进程在退出前进行清理工作。(来源于网络)

nvidia-smi

nvidia-smi

显示 GPU 状态的摘要信息:

nvidia-smi

显示详细的 GPU 状态信息:

nvidia-smi -l 1

这个命令会每1秒更新一次状态信息。

显示 GPU 的帮助信息:

nvidia-smi -h

列出所有 GPU 并显示它们的 PID 和进程名称:

nvidia-smi pmon

强制结束指定的 GPU 进程:

nvidia-smi --id=0 --ex_pid=12345

这会强制结束 GPU ID 为 0 上的 PID 为 12345 的进程。

设置 GPU 性能模式:

nvidia-smi -pm 1
nvidia-smi -i 0 -pm 1

第一个命令会为所有 GPU 设置为性能模式,第二个命令只针对 ID 为 0 的 GPU。

重启 GPU:

nvidia-smi --id=0 -r

这会重启 ID 为 0 的 GPU。
在这里插入图片描述

tmux

这里介绍一个工具TMUX,TMUX 是一个终端多路复用器。它可以在多个终端之间轻松切换,分离它们(这不会杀死终端,它们继续在后台运行)和将它们重新连接到其他终端中。为什么要介绍这个工具呢?因为在后面进行Xtuner微调模型的时候,时间会很长,使用Tmux可以解决程序被杀死中断的情况,下面介绍一下如何安装并使用。

因为开发机使用的是ubuntu的操作系统,可以使用lsb_release -a 命令查看ubuntu的系统信息:

lsb_release -a

在这里插入图片描述
然后使用apt install tmux命令安装tmux,安装完成以后可以使用tmux命令就可以使用tmux了,如果想退出tmux可以使用“Ctrl+d”快捷键。

开发机仅 /root 路径下的文件是持久化存储的,其他路径下安装的软件重启后都会被重置。
详细教程
https://www.ruanyifeng.com/blog/2019/10/tmux.html

参考文章:

https://github.com/InternLM/Tutorial/tree/camp4/docs/L0/linux

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值