Linux基礎知識目錄
- 前言
- Linux+InternStudio 關卡
- 1. InternStudio開發機介紹
- 2. SSH及端口映射
- 2.1 什么是SSH?
- 2.2 如何使用SSH遠程連接開發機?
- 2.2.1 使用密碼進行SSH遠程連接
- 2.2.2 配置SSH密鑰進行SSH遠程連接
- 2.2.3 使用VScode進行SSH遠程連接
- 2.3. 端口映射
- 2.3.1 什么是端口映射?
- 2.3.2 如何進行端口映射?
- 2.3.2.1 使用 ssh 命令進行端口映射
- 2.3.2.2 使用 vscode 進行端口映射
- 3. Linux 基礎命令
- 3.1 文件管理
- 3.1.1 **touch**
- 3.1.2 **mkdir**
- 3.1.3 **cd**
- 3.1.4 **pwd**
- 3.1.5 **cat**
- 3.1.6 **vi or vim**
- 3.1.7 **cp 和 ln(重點)**
- 3.1.8 **mv 和 rm**
- 3.1.9 **find**
- 3.1.10 **ls**
- 3.1.11 **sed**
- 3.2 進程管理
- 3.3 **工具使用**
- 4. Conda和Shell介紹(附加)
- 4.1 conda設置
- 4.2 conda環境管理
- 4.2.1 創建虛擬環境
- 4.2.2 查看有哪些虛擬環境
- 4.2.3 激活與退出虛擬環境
- 4.2.4 刪除與導出虛擬環境
- 4.3 conda和pip
- 4.4 studio-conda使用與Shell(擴展)
- 常見問題
- 1. InternStudio 開發機的環境玩壞了,如何初始化開發機環境
- 關卡任務
前言
本文是由上海人工智能實驗室主辦的第三期書生大模型實戰營的筆記,僅供個人和助教批改作業參考,教程原文鏈接。
報名請在微信搜索“第三期書生大模型實戰營”。
本筆記是在原教程的基礎上修改的個人批注的筆記
Linux+InternStudio 關卡
😀Hello大家好,歡迎來到書生大模型實戰營,這里是實戰營為第一次參加實戰營同學,和來自各個行業的沒有Linux基礎知識的同學準備的基礎課程,在這里我們會教大家如何使用InternStudio開發機,以及掌握一些基礎的Linux知識,讓大家不至于在后面的課程中無從下手,希望對大家有所幫助。在這里關卡任務中為大家準備了一些關卡任務,當大家完成必做關卡任務并打卡后,就會獲得當前關卡的算力獎勵了,讓我們開始吧!
1. InternStudio開發機介紹
InternStudio 是大模型時代下的云端算力平臺。基于 InternLM 組織下的諸多算法庫支持,為開發者提供開箱即用的大語言模型微調環境、工具、數據集,并完美兼容 🤗 HugginFace 開源生態。
如果大家想了解更多關于InternStduio的介紹的話可以查看下面的文檔: InternStudio
https://studio.intern-ai.org.cn/
首先打開上面的鏈接進入InternStudio,完成登錄會自動跳轉到控制臺界面,如下圖所示:
下面給大家講一下每一個序號對應頁面的功能:
- 在這里可以創建開發機,以及修改開發機配置和查看相關日志等。
- 這里可以可視化查看開發機中的文件及文件夾,而且如果你創建了兩個開發機,那么他們使用的云盤是一個。(因為每一個開發機都是一個Docker 容器,存儲云盤掛載的都是一個,關于專業名詞解釋可以看: 專業名詞解釋)在這里你可以上傳文件或者文件夾,以及創建文件,還可以查看隱藏文件。
- 這是開發機新增的功能,如果大家要做項目的話,可以向小助手申請資源,團隊的功能是所有成員共享算力資源,避免造成資源浪費。(畢竟燒的可都是💴啊)
- 這里是用來配置SSH密鑰的,我們在后面會講到如何使用。
- 最后這個地方是來編輯你的個人信息的,以及查看你算力資源的具體使用。
上面就是InternStudio平臺的簡單介紹,下面讓我們來看一下如何創建開發機,我們來到首頁,點擊“創建開發機”
這里我們選擇創建個人開發機,名稱為test,Cuda版本為12.2,資源配置選擇10%,時長默認就行。
創建完成以后在開發機界面可以看到剛剛創建的開發機,點擊進入開發機。
進入開發機以后可以看到開發機的主頁面,開發機有三種模式可以選擇:JupyterLab、終端和VScode
其中:
- JupyterLab:一個交互式的編程和教學環境,同時內置終端,可以很方便地查看文件,執行代碼等
- 終端(Terminal, 最輕量級):主要進行命令行操作,或者運行腳本和簡單程序
- VSCode:網頁中集成的VSCode,也可以在本地VSCode中通過SSH連接遠程開發,下面就會講如何配置遠程連接。
- 這個是資源使用情況,在后續的課程中會使用到。
2. SSH及端口映射
上面我們介紹了InternStudio平臺,以及如何創建開發機,這一小節,我們要了解什么是SSH、為什么使用遠程連接、如何使用SSH遠程連接開發機、什么是端口映射以及如何進行端口映射。
2.1 什么是SSH?
SSH全稱Secure Shell,中文翻譯為安全外殼,它是一種網絡安全協議,通過加密和認證機制實現安全的訪問和文件傳輸等業務。SSH 協議通過對網絡數據進行加密和驗證,在不安全的網絡環境中提供了安全的網絡服務。
SSH 是(C/S架構)由服務器和客戶端組成,為建立安全的 SSH 通道,雙方需要先建立 TCP 連接,然后協商使用的版本號和各類算法,并生成相同的會話密鑰用于后續的對稱加密。在完成用戶認證后,雙方即可建立會話進行數據交互。
那在后面的實踐中我們會配置SSH密鑰,配置密鑰是為了當我們遠程連接開發機時不用重復的輸入密碼,那為什么要進行遠程連接呢?
遠程連接的好處就是,如果你使用的是遠程辦公,你可以通過SSH遠程連接開發機,這樣就可以在本地進行開發。而且如果你需要跑一些本地的代碼,又沒有環境,那么遠程連接就非常有必要了。
2.2 如何使用SSH遠程連接開發機?
2.2.1 使用密碼進行SSH遠程連接
首先我們使用輸入密碼的方式進行SSH遠程連接,后面我們會講如何配置免密登錄。
當完成開發機的創建以后,我們需要打開自己電腦的powerShell終端,使用Win+R快捷鍵打開運行框,輸入powerShell,打開powerShell終端。(如果你是Linux或者Mac操作系統,下面的步驟都是一樣的)
我們回到開發機平臺,進入開發機頁面找到我們創建的開發機,點擊SSH連接。
然后復制登錄命令,這里的37367是開發機所使用的SSH端口,一般使用的都是22端口,沒有這個端口號的話是連不上SSH的,并且每個人的端口都不一樣,所以如果大家在連接開發機時出現連不上的情況,那就需要檢查一下是不是端口錯了。
將復制的命令粘貼到powershell中,然后回車,這里我們需要輸入密碼,我們將登錄命令下面的密碼復制下來,然后粘貼到終端中注意密碼復制后右鍵就粘貼好了,shell的粘貼快捷鍵有的電腦是shift+ins
,這里密碼粘貼密碼是不顯示的,這是正常的。
最后回車出現以下內容就代表成功了:
當我們連接上開發機以后,可以使用hostname
查看開發機名稱,使用uname -a
查看開發機內核信息,使用lsb_release -a
查看開發機版本信息,使用nvidia-smi
查看GPU的信息,這些命令我們后面都會講到,如果想要退出遠程連接,輸入兩次exit
就可以了。
2.2.2 配置SSH密鑰進行SSH遠程連接
但是在我們開發學習的時候,每次遠程都輸入密碼比較麻煩,我們可以設置SSH key來跳過輸入密碼這一步驟,在ssh命令中我們可以使用ssh-keygen命令來生成密鑰
SSH密鑰是一種安全便捷的登錄認證方式,用于在SSH協議中進行身份驗證和加密通信。
ssh-keygen支持RSA和DSA兩種認證密鑰。
常用參數包括:
- -t:指定密鑰類型,如dsa、ecdsa、ed25519、rsa。
- -b:指定密鑰長度。
- -C:添加注釋。
- -f:指定保存密鑰的文件名。
- -i:讀取未加密的ssh-v2兼容的私鑰/公鑰文件。
這里我們使用RSA算法生成密鑰,命令為:
ssh-keygen -t rsa
輸入命令后一路回車就可以了,這里的密鑰默認情況下是生成在~/.ssh/
目錄下的,~
表示的是家目錄,如果是windows就是C:\Users\{your_username}\
。在powerShell中可以使用Get-Content
命令查看生成的密鑰,如果是linux操作系統可以使用cat
命令。
然后我們回到開發機平臺,在首頁點擊配置SSH Key,接著點擊添加SSH公鑰,
將剛剛生成的密鑰復制下來,粘貼到公鑰框中,名稱會被自動識別到,最后點擊立即添加,SSH Key就配置完成了。
完成SSH Key創建以后,重啟終端進行遠程連接,就會跳過密碼輸入這一步了。
2.2.3 使用VScode進行SSH遠程連接
當然也可以使用SSH遠程連接軟件,例如:Windterm、Xterminal等。這里我們使用VScode進行遠程連接,使用VScode的好處是,本身它就是代碼編輯器,進行代碼修改等操作時會非常方便。
如果要在VScode中進行遠程連接,我們還需要安裝一套插件,如何安裝VScode大家可以網上搜索一下非常簡單。(開發機里邊的vscode搜索不到這個插件,本地vscode可以)
如果你已經安裝好了VScode,可以在點擊左側的擴展頁面,在搜索框中輸入“SSH”,第一個就是我們要安裝的插件,點開它“Install”就可以了。
安裝完成插件以后,點擊側邊欄的遠程連接圖標,在SSH中點擊“+”按鈕,添加開發機SSH連接的登錄命令。
我們將登錄命令復制下來,然后將命令粘貼到彈出的窗口中,最后回車:
配置文件這一塊默認就好,當然你也可以自定義,下面是配置文件的具體內容:(這里包括了你所有遠程連接過的信息)
Host ssh.intern-ai.org.cn #主機ip也可以是域名HostName ssh.intern-ai.org.cn #主機名Port 37367 #主機的SSH端口User root #登錄SSH使用的用戶StrictHostKeyChecking noUserKnownHostsFile /dev/null
后面的一些配置選項,如果想要手動添加就需要按照上面的格式對相應部分進行修改。
如果將*
StrictHostKeyChecking
no
和UserKnownHostsFile
*/dev/null
刪除掉會跳出指紋驗證的彈窗:
StrictHostKeyChecking no
表示禁用嚴格的主機密鑰檢查。這意味著當連接到一個新的 SSH 服務器時,不會嚴格驗證服務器的主機密鑰,可能會帶來一定的安全風險。
UserKnownHostsFile /dev/null
則是將用戶已知的主機密鑰文件設置為 /dev/null ,這實質上是忽略了對已知主機密鑰的記錄和使用。但是在一般的安全實踐中,不建議隨意禁用嚴格的主機密鑰檢查。
然后在右下角彈出來的提示窗口中點擊“連接”就可以遠程到開發機中了。
遠程連接完成以后,可以選擇打開的文件夾,也可以稱為工作目錄,你可以選擇開發機中的也可以選擇本地的,開發機中的文件夾,就是我們前面提到的云盤。
當下一次進行遠程連接的時候,就不需要輸入登錄命令等信息了,只需要打開vscode的遠程連接就可以看到第一次連接的開發機信息,下面的root
代表我們第一連接開發機時使用的是/root
工作目錄。
并且下圖中的->
表示進入開發機后需要重新選擇工作目錄:
而下圖中的->
表示進入上一次開發機選擇的工作目錄:
每次選擇的工作目錄都會在這個開發機信息下面顯示:(這里就多了一個lagent的工作目錄)
下面我們來介紹一下什么時端口映射。
2.3. 端口映射
2.3.1 什么是端口映射?
端口映射是一種網絡技術,它可以將外網中的任意端口映射到內網中的相應端口,實現內網與外網之間的通信。通過端口映射,可以在外網訪問內網中的服務或應用,實現跨越網絡的便捷通信。
那么我們使用開發機為什么要進行端口映射呢?
因為在后續的課程中我們會進行模型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端口。
這意味著,即使開發機的這個端口沒有直接暴露給外部網絡,我們也可以通過這個隧道安全地訪問遠程服務器上的服務。。
2.3.2 如何進行端口映射?
2.3.2.1 使用 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文件(在開發機界面右鍵創建文件,修改名字為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()
編輯完成后記得ctrl+s
保存
在運行代碼之前,需要先使用pip install gradio==4.29.0
命令安裝以下依賴包(命令復制粘貼到終端里),然后在Web IDE的終端中運行了一個python hello_world.py
命令
如果不進行端口映射的話,使用本地IP是訪問不了的
我可以使用下面的命令,將它輸入到powerShell中:
ssh -p 37367 root@ssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyChecking=no
這樣就代表成功了。(注意:這個命令不返回任何的內容,這樣代表端口映射在運行了,然后在網頁中打開連接就可以看到web ui的界面了)
2.3.2.2 使用 vscode 進行端口映射
當然,如果我們運行不同的web ui的話,需要重復輸入命令,這樣很麻煩,這就需要用到VScode了。前面我們已經SSH遠程連接了開發機,VScode提供了自動端口映射的功能,我們不需要手動配置,我們可以使用“Ctrl+Shift+~”快捷鍵喚醒終端,在終端的右側可以找到端口選項:
在這里可以查看端口映射的信息,如果需要修改端口的話,可以在端口那一欄修改端口號。
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
命令。
這里介紹幾種我們在課程中會使用到的命令:
3.1.1 touch
我們可以使用touch快速的創建文件,這樣我們不用手動點擊進行創建了。例如我們要創建一個demo.py
文件:
3.1.2 mkdir
同樣的使用方法,如果要創建一個名為test
的目錄:
3.1.3 cd
這個命令會是使用最多的一個命令,在使用之前需要為沒有計算機基礎的同學講一下目錄結構,畫一張圖讓大家理解:
我們現在使用的是root
目錄,也是root用戶的家目錄~
,linux操作系統中/
表示根目錄,根目錄下有許多系統所需的目錄和文件,剛才我們創建的目錄就存在與root
目錄下,其中.
表示的是當前目錄,..
表示的上級目錄。如果我現在要進入到test
目錄,然后回到root
目錄,我們可以這樣操作:
3.1.4 pwd
我們可以使用pwd
命令查看當前所在的目錄:這樣可以方便我們確定我們當前所在哪個目錄下面。
3.1.5 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除外
3.1.6 vi or vim
當我們需要編輯文件的時候可以使用vi
或者vim
命令,當你進入文件編輯以后,有三種模式:
進入編輯模式可以使用i
,vim的方便之處就是可以在終端進行簡單的文件修改。
3.1.7 cp 和 ln(重點)
**cp
**命令在后面課程中會經常用到,它是用來將一個文件或者目錄復制到另一個目錄下的操作,常用的使用有:
- 復制文件:
cp 源文件 目標文件
- 復制目錄:
cp -r 源目錄 目標目錄
但是如果我們是要使用模型的話,這種操作會占用大量的磁盤空間,所以我們一般使用ln
命令,這個就和windows的快捷方式一樣。linux中鏈接分為兩種 : 硬鏈接(hard link)與軟鏈接(symbolic link),硬鏈接的意思是一個檔案可以有多個名稱,而軟鏈接的方式則是產生一個特殊的檔案,該檔案的內容是指向另一個檔案的位置。硬鏈接是存在同一個文件系統中,而軟鏈接卻可以跨越不同的文件系統。
所以我們一般使用軟連接,它的常用的使用方法如下:
ln [參數][源文件或目錄][目標文件或目錄]
參數如下:
- -s:創建軟鏈接(符號鏈接)也是最常用的;
- -f:強制執行,覆蓋已存在的目標文件;
- -i:交互模式,文件存在則提示用戶是否覆蓋;
- -n:把符號鏈接視為一般目錄;
- -v:顯示詳細的處理過程。
3.1.8 mv 和 rm
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
。
3.1.9 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
結尾的文件。
3.1.10 ls
ls
命令可以用來列出目錄的內容以及詳細信息。
常用參數及使用方法如下:
-a
:顯示所有文件和目錄,包括隱藏文件(以.
開頭的文件或目錄)。-l
:以長格式顯示詳細信息,包括文件權限、所有者、大小、修改時間等。-h
:與-l
結合使用,以人類可讀的方式顯示文件大小(如K
、M
、G
等)。-R
:遞歸列出子目錄的內容。-t
:按文件修改時間排序顯示。、
3.1.11 sed
sed
命令是一種流編輯器,主要用于文本處理,在處理復雜的文件操作時經常用到,在后續的課程中會使用到,sed
命令常用參數及使用示例如下:
- 參數說明:
-e<script>
或--expression=<script>
:直接在命令行中指定腳本進行文本處理。-f<script文件>
或--file=<script文件>
:從指定的腳本文件中讀取腳本進行文本處理。-n
或--quiet
或--silent
:僅打印經過腳本處理后的輸出結果,不打印未匹配的行。
- 動作說明:
a
:在當前行的下一行添加指定的文本字符串。c
:用指定的文本字符串替換指定范圍內的行。d
:刪除指定的行。i
:在當前行的上一行添加指定的文本字符串。p
:打印經過選擇的行。通常與-n
參數一起使用,只打印匹配的行。s
:使用正則表達式進行文本替換。例如,s/old/new/g
將所有 “InternLM” 替換為 “InternLM yyds”。
- 示例:
在示例中使用了echo
命令,這和python中的print
一樣,用來打印內容,這里使用管道符>
將InternLM打印到file文件中,常用的管道符還有<
和|
,比如我們可以使用grep
命令來查看python中安裝的包含os
字段的包:
grep
是一個強大的文本搜索工具。常用參數如下:
-i
:忽略大小寫進行搜索。-v
:反轉匹配,即顯示不匹配的行。-n
:顯示行號。-c
:統計匹配的行數。
3.2 進程管理
進程管理命令是進行系統監控和進程管理時的重要工具,常用的進程管理命令有以下幾種:
- ps:查看正在運行的進程
- top:動態顯示正在運行的進程
- pstree:樹狀查看正在運行的進程
- pgrep:用于查找進程
- nice:更改進程的優先級
- jobs:顯示進程的相關信息
- bg 和 fg:將進程調入后臺
- kill:殺死進程
在開發機中還有一條特殊的命令nvidia-smi
,它是 NVIDIA 系統管理接口(NVIDIA System Management Interface)的命令行工具,用于監控和管理 NVIDIA GPU 設備。它提供了一種快速查看 GPU 狀態、使用情況、溫度、內存使用情況、電源使用情況以及運行在 GPU 上的進程等信息的方法。
下面是關于各個命令使用示例:
ps
:列出當前系統中的進程。使用不同的選項可以顯示不同的進程信息,例如:-
ps aux # 顯示系統所有進程的詳細信息
-
top
:動態顯示系統中進程的狀態。它會實時更新進程列表,顯示CPU和內存使用率最高的進程。-
top # 啟動top命令,動態顯示進程信息
-
pstree
:以樹狀圖的形式顯示當前運行的進程及其父子關系。-
pstree # 顯示進程樹
-
pgrep
:查找匹配條件的進程。可以根據進程名、用戶等條件查找進程。-
pgrep -u username # 查找特定用戶的所有進程
-
nice
:更改進程的優先級。nice
值越低,進程優先級越高。-
nice -n 10 long-running-command # 以較低優先級運行一個長時間運行的命令
-
jobs
:顯示當前終端會話中的作業列表,包括后臺運行的進程。-
jobs # 列出當前會話的后臺作業
-
bg
和fg
:bg
將掛起的進程放到后臺運行,fg
將后臺進程調回前臺運行。-
bg # 將最近一個掛起的作業放到后臺運行 fg # 將后臺作業調到前臺運行
-
kill
:發送信號到指定的進程,通常用于殺死進程。-
kill PID # 殺死指定的進程ID
-
注意,
kill
命令默認發送SIGTERM
信號,如果進程沒有響應,可以使用-9
使用SIGKILL
信號強制殺死進程: -
kill -9 PID # 強制殺死進程
-
SIGTERM
(Signal Termination)信號是Unix和類Unix操作系統中用于請求進程終止的標準信號。當系統或用戶想要優雅地關閉一個進程時,通常會發送這個信號。與SIGKILL
信號不同,SIGTERM
信號可以被進程捕獲并處理,從而允許進程在退出前進行清理工作。(來源于網絡)
以下是 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。
-
- 顯示幫助信息:
-
nvidia-smi -h
-
下面通過一張圖片對GPU信息進行介紹:
3.3 工具使用
這里介紹一個工具TMUX
,TMUX
是一個終端多路復用器。它可以在多個終端之間輕松切換,分離它們(這不會殺死終端,它們繼續在后臺運行)和將它們重新連接到其他終端中。為什么要介紹這個工具呢?因為在后面進行Xtuner
微調模型的時候,時間會很長,使用Tmux
可以解決程序被殺死中斷的情況,下面介紹一下如何安裝并使用。
因為開發機使用的是ubuntu的操作系統,可以使用lsb_release -a
命令查看ubuntu的系統信息:
然后使用apt install tmux
命令安裝tmux,安裝完成以后可以使用tmux
命令就可以使用tmux了,如果想退出tmux可以使用“Ctrl+d”快捷鍵。
開發機僅 /root 路徑下的文件是持久化存儲的,其他路徑下安裝的軟件重啟后都會被重置。
具體的使用方法可以查看:
https://www.ruanyifeng.com/blog/2019/10/tmux.html
4. Conda和Shell介紹(附加)
Conda 是一個開源的包管理和環境管理系統,可在 Windows、macOS 和 Linux 上運行。它快速安裝、運行和更新軟件包及其依賴項。使用 Conda,您可以輕松在本地計算機上創建、保存、加載和切換不同的環境。
在開發機中已經安裝了conda
,我們可以直接使用,而且開發機中也有內置的conda
命令studio-conda
,下面我們會介紹conda
的基本使用,還有studio-conda
的使用方法以及介紹一下studio-conda
是怎么實現的。
我們會從下面幾部分進行介紹:
- conda設置
- conda環境管理
- conda和pip
- studio-conda使用與Shell(擴展)
4.1 conda設置
我們可以使用conda --version
來查看當前開發機中conda
的版本信息:
當我們要使用conda
安裝包的時候會非常慢,我們可以設置國內鏡像提升安裝速度,示例如下:
#設置清華鏡像
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
但是我們一般都是使用pip
進行包的安裝的,后面我們會介紹pip
和conda
的區別。
如果我們想要查看conda的配置信息可以使用conda config --show
命令,如果是開發機默認的設置的話會返回:(一部分信息)
這些配置在Conda
環境配置中,會影響軟件包的安裝、更新、環境管理等操作的方式和結果。
4.2 conda環境管理
這一部分是conda
中非常重要的一部分,掌握了這一部分大家就可以將開發環境玩轉到飛起了😀。
4.2.1 創建虛擬環境
我們可以使用conda create -n name python``=3.10
創建虛擬環境,這里表示創建了python版本為3.10、名字為name的虛擬環境。創建后,可以在.conda
目錄下的envs
目錄下找到。
在不指定python版本時,會自動創建基于最新python版本的虛擬環境。同時我們可以在創建虛擬環境的同時安裝必要的包:conda create -n name numpy matplotlib python=3.10
(但是不建議大家這樣用)
創建虛擬環境的常用參數如下:
- -n 或 --name:指定要創建的環境名稱。
- -c 或 --channel:指定額外的軟件包通道。
- –clone:從現有的環境克隆來創建新環境。
- -p 或 --prefix:指定環境的安裝路徑(非默認位置)。
4.2.2 查看有哪些虛擬環境
如果想要查看有哪些虛擬環境我們可以使用下面的命令:
conda env list
conda info -e
conda info --envs
同時我們還可以看到環境所在的目錄。
4.2.3 激活與退出虛擬環境
當我們創建完虛擬環境后我們可以使用conda activate name
命令來激活虛擬環境,如何查看是否切換成功呢?很簡單,只需要看(base)
是否變成了創建的虛擬環境的名稱。
如果想要退出虛擬環境的話可以使用:
conda activate
conda deactivate
這兩條命令都會回到base
環境,因為base
是conda的基礎環境,如果仔細觀察的話,base
環境目錄比其他的虛擬環境目錄層級要高。
4.2.4 刪除與導出虛擬環境
如果想要刪除某個虛擬環境可以使用conda remove --name name --all
,如果只刪除虛擬環境中的某個或者某些包可以使用conda remove --name name package_name
導出虛擬環境對于特定的環境是非常有必要的,因為有些軟件包的依賴關系很復雜,如果自己重新進行創建和配置的話很麻煩,如果我們將配置好的環境導出,這樣下次使用還原就行了,而且也可以把配置分享給其他人。
#獲得環境中的所有配置
conda env export --name myenv > myenv.yml
#重新還原環境
conda env create -f myenv.yml
比如我們將xtuner0.1.17
虛擬環境導出,配置信息是這樣的:
其中包括環境名字、虛擬環境軟件包的在線存儲庫的位置和虛擬環境的依賴。后面我們會使用進階的使用方法來快速的還原虛擬環境。
4.3 conda和pip
這部分我們介紹一些conda
和pip
的一些區別:
- conda可以管理非python包,pip只能管理python包。
- conda可以用來創建虛擬環境,pip不能,需要依賴virtualenv之類的包。
- conda安裝的包是編譯好的二進制文件,安裝包文件過程中會自動安裝依賴包;pip安裝的包是wheel或源碼,裝過程中不會去支持python語言之外的依賴項。
- conda安裝的包會統一下載到當前虛擬環境對應的目錄下,下載一次多次安裝。pip是直接下載到對應環境中。
Wheel 是一種 Python 安裝包的格式。
它是一種預編譯的二進制分發格式,類似于 conda 中的已編譯二進制文件。
Wheel 格式的主要優點包括:
- 安裝速度快:因為已經進行了預編譯,所以在安裝時不需要像源碼安裝那樣進行編譯過程,節省了時間。
- 一致性:確保在不同的系統和環境中安裝的結果是一致的。
例如,如果您要安裝一個大型的 Python 庫,使用 Wheel 格式可以避免在不同的機器上因為編譯環境的差異而導致的安裝問題。而且,對于那些沒有編譯環境或者編譯能力較弱的系統,Wheel 格式能夠讓安裝過程更加順暢。
4.4 studio-conda使用與Shell(擴展)
這一部分屬于擴展的部分,因為我覺得這一部分非常有趣,也非常實用,所以如果大家有興趣的可以學習一下。
我們先來介紹一下studio-conda
,這是開發機內置的一個命令,它通過Shell腳本來實現的。什么是Shell腳本呢?
Shell 腳本 是一種包含一系列命令的文本文件,這些命令按照特定的順序排列,用于在 Unix/Linux 或類似的操作系統環境中自動執行任務。
Shell 腳本通常使用 Shell 語言編寫,常見的 Shell 語言如 Bash、Sh 等,就是我們前面所介紹了Linux基礎命令,這就屬于Shell語言。
它有以下幾個重要特點:
- 自動化:可以將一系列重復、復雜的操作編寫為一個腳本,然后只需運行腳本即可自動完成這些操作,從而節省時間和減少錯誤。例如,每天定時備份重要文件的腳本。
- 系統管理:用于管理系統配置、用戶權限、進程控制等。比如,創建新用戶并設置其權限的腳本。
- 批處理:能夠同時處理多個文件或數據。例如,將一批圖片文件從一種格式轉換為另一種格式的腳本。
- 流程控制:像條件判斷(if-else)、循環(for、while)等,使腳本能夠根據不同的情況執行不同的操作。
那studio-conda
就屬于自動化的一部分,在我們開發機中root用戶的bash環境的配置文件是.bashrc
,但其實主要的配置文件是/share/.aide/config/bashrc
,在這個文件里面寫了一些命令,可以讓我們更快捷的執行一些操作,比如:
export no_proxy='localhost,127.0.0.1,0.0.0.0,172.18.47.140'
export PATH=/root/.local/bin:$PATH
export HF_ENDPOINT='https://hf-mirror.com'
alias studio-conda="/share/install_conda_env.sh"
alias studio-smi="/share/studio-smi"
export
是用來設置環境變量的,alias
是將一個sh文件復制為一個變量,這個可以作為命令在終端中執行,我們的studio-conda
就是這樣的。
這里的studio-smi
是用來查看查看虛擬內存占用的,當我們打開/share/studio-smi
文件可以看到:
#!/bin/bashif command -v vgpu-smi &> /dev/null
thenecho "Running studio-smi by vgpu-smi"vgpu-smi
elseecho "Running studio-smi by nvidia-smi"nvidia-smi
fi
這個腳本是用于檢查系統中是否存在 vgpu-smi
命令,如果存在,它將運行 vgpu-smi
來顯示虛擬 GPU (vGPU) 的狀態信息;如果不存在,它將運行 nvidia-smi
來顯示 NVIDIA GPU 的狀態信息。如下圖所示:
nvidia-smi
是用于監控和管理物理 NVIDIA GPU 設備的工具,而 vgpu-smi
專門用于監控和管理通過 NVIDIA vGPU 技術虛擬化的 GPU 資源。
我們查看/share/install_conda_env.sh
文件內容如下:
#!/bin/bash
# clone internlm-base conda env to user's conda env
# created by xj on 01.07.2024
# modifed by xj on 01.19.2024 to fix bug of conda env clone
# modified by ljy on 01.26.2024 to extendXTUNER_UPDATE_DATE=`cat /share/repos/UPDATE | grep xtuner |awk -F= '{print $2}'`
HOME_DIR=/root
CONDA_HOME=$HOME_DIR/.conda
SHARE_CONDA_HOME=/share/conda_envs
SHARE_HOME=/sharelist() {cat <<-EOF預設環境 描述internlm-base pytorch:2.0.1, pytorch-cuda:11.7xtuner Xtuner(源碼安裝: main $(echo -e "\033[4mhttps://github.com/InternLM/xtuner/tree/main\033[0m"), 更新日期:$XTUNER_UPDATE_DATE)pytorch-2.1.2 pytorch:2.1.2, pytorch-cuda:11.8
EOF
}help() {cat <<-EOF說明: 用于快速clone預設的conda環境使用: 1. studio-conda env -l/list 打印預設的conda環境列表2. studio-conda <target-conda-name> 快速clone: 默認拷貝internlm-base conda環境3. studio-conda -t <target-conda-name> -o <origin-conda-name> 將預設的conda環境拷貝到指定的conda環境EOF
}clone() {source=$1target=$2if [[ -z "$source" || -z "$target" ]]; thenecho -e "\033[31m 輸入不符合規范 \033[0m"helpexit 1fiif [ ! -d "${SHARE_CONDA_HOME}/$source" ]; thenecho -e "\033[34m 指定的預設環境: $source不存在\033[0m"listexit 1fiif [ -d "${CONDA_HOME}/envs/$target" ]; thenecho -e "\033[34m 指定conda環境的目錄: ${CONDA_HOME}/envs/$target已存在, 將清空原目錄安裝 \033[0m"wait_echo&wait_pid=$!rm -rf "${CONDA_HOME}/envs/$target"kill $wait_pidfiecho -e "\033[34m [1/2] 開始安裝conda環境: <$target>. \033[0m"sleep 3tar --skip-old-files -xzvf /share/pkgs.tar.gz -C ${CONDA_HOME}wait_echo&wait_pid=$!conda create -n $target --clone ${SHARE_CONDA_HOME}/${source}if [ $? -ne 0 ]; thenecho -e "\033[31m 初始化conda環境: ${target}失敗 \033[0m"exit 10fikill $wait_pid# for xtuner, re-install dependenciescase "$source" inxtuner)source_install_xtuner $target;;esacecho -e "\033[34m [2/2] 同步當前conda環境至jupyterlab kernel \033[0m"lab add $targetsource $CONDA_HOME/bin/activate $targetcd $HOME_DIRecho -e "\033[32m conda環境: $target安裝成功! \033[0m"echo """============================================ALL DONE!============================================"""
}······
dispatch $@
其中的*list
*()
等,都是studio-conda
的函數,可以實現某些操作,比如我們可以使用studio-conda env list
來查看預設的環境:
其中*clone
*()
函數的主要作用就是用來復制環境的,不過只能從預設的環境中進行復制,主要的代碼其實就是:
tar --skip-old-files -xzvf /share/pkgs.tar.gz -C ${CONDA_HOME}conda create -n $target --clone ${SHARE_CONDA_HOME}/${source}
解壓預設環境的壓縮包,然后通過clone創建虛擬環境,不過在Shell腳本中還設置了一些邏輯,不過都是一些判斷,如果你熟悉任何一種編程語言應該都可以看懂,如果看不懂問題也不大。
那么我們如何將我們自己創建的環境添加到studio-conda
中呢?
第一步,將新的conda環境創建到/share/conda_envs下
conda create -p /share/conda_envs/xxx python=3.1x
第二步,將本機/root/.conda/pkgs下的文件拷貝到/share/pkgs中,重新壓縮并替換(此步驟是為了把conda創建過程中大的公共包存儲起來,避免重復下載)
cp -r -n /root/.conda/pkgs/* /share/pkgs/
cd /share && tar -zcvf pkgs.tar.gz pkgs
第三步,更新install_conda_env.sh中的list函數,增加新的conda環境說明。
上面是開發機默認提供的方法,其實還有一種方法,我們前面使用conda
導出過xtuner0.1.17
虛擬環境的配置文件,我們可以使用conda env create -f xtuner0.1.17.yml
命令來還原虛擬環境。下面我們來寫一個簡單的Shell腳本來實現這個操作:我們在根目錄下創建test.sh
文件,寫入以下內容:
#!/bin/bash# 定義導出環境的函數
export_env() {local env_name=$1echo "正在導出環境: $env_name"# 導出環境到當前目錄下的env_name.yml文件conda env export -n "$env_name" > "$env_name.yml"echo "環境導出完成。"
}# 定義還原環境的函數
restore_env() {local env_name=$1echo "正在還原環境: $env_name"# 從當前目錄下的env_name.yml文件還原環境conda env create -n "$env_name" -f "$env_name.yml"echo "環境還原完成。"
}# 檢查是否有足夠的參數
if [ $# -ne 2 ]; thenecho "使用方法: $0 <操作> <環境名>"echo "操作可以是 'export' 或 'restore'"exit 1
fi# 根據參數執行操作
case "$1" inexport)export_env "$2";;restore)restore_env "$2";;*)echo "未知操作: $1"exit 1;;
esac
當我們完成Shell腳本的創建以后我們需要為腳本賦予權限,可以使用命令:chmod +x test.sh
,然后輸入./test.sh restore xtuner0.1.17
并按下回車就可以還原虛擬環境了。
不過這種跟直接使用沒什么太大區別,如果將這種操作與開發機中的studio-conda
命令結合起來會非常方便,不過由于復制環境的方法不太一樣。所以如果要實現需要對/share/install_conda_env.sh
文件的邏輯進行修改。
好了,以上就是我們本關卡的全部內容了,希望上面的內容對大家后面學習有幫助,如果大家想要學習更多linux的相關知識,可以看我博客文章,雖然說不會linux對我們學習大模型沒有太大影響,但是linux如果學習的很好,會讓你在學習大模型的路上非常順暢的。最后大家不要忘了完成我們前面設置的關卡呦!
博客鏈接:linux
常見問題
1. InternStudio 開發機的環境玩壞了,如何初始化開發機環境
慎重執行!!!!所有數據將會丟失,僅限 InternStudio 平臺,自己的機器千萬別這么操作
- 第一步本地終端 ssh 連上開發機(一定要 ssh 連接上操作,不能在 web 里面操作!!!)
- 第二步執行
rm -rf /root
,大概會等待10分鐘 - 第三步重啟開發機,系統會重置 /root 路徑下的配置文件
- 第四步
ln -s /share /root/share
關卡任務
闖關任務需要在關鍵步驟中截圖:
任務描述 | 完成所需時間 | |
---|---|---|
闖關任務 | 完成SSH連接與端口映射并運行hello_world.py | 10min |
可選任務 1 | 將Linux基礎命令在開發機上完成一遍 | 10min |
可選任務 2 | 使用 VSCODE 遠程連接開發機并創建一個conda環境 | 10min |
可選任務 3 | 創建并運行test.sh 文件 | 10min |