第一關:Linux基礎知識

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,完成登錄會自動跳轉到控制臺界面,如下圖所示:

在這里插入圖片描述

下面給大家講一下每一個序號對應頁面的功能:

  1. 在這里可以創建開發機,以及修改開發機配置和查看相關日志等。

在這里插入圖片描述

  1. 這里可以可視化查看開發機中的文件及文件夾,而且如果你創建了兩個開發機,那么他們使用的云盤是一個。(因為每一個開發機都是一個Docker 容器,存儲云盤掛載的都是一個,關于專業名詞解釋可以看: 專業名詞解釋)在這里你可以上傳文件或者文件夾,以及創建文件,還可以查看隱藏文件。

在這里插入圖片描述

  1. 這是開發機新增的功能,如果大家要做項目的話,可以向小助手申請資源,團隊的功能是所有成員共享算力資源,避免造成資源浪費。(畢竟燒的可都是💴啊)
  2. 這里是用來配置SSH密鑰的,我們在后面會講到如何使用。
  3. 最后這個地方是來編輯你的個人信息的,以及查看你算力資源的具體使用。

上面就是InternStudio平臺的簡單介紹,下面讓我們來看一下如何創建開發機,我們來到首頁,點擊“創建開發機

在這里插入圖片描述

這里我們選擇創建個人開發機,名稱為testCuda版本為12.2,資源配置選擇10%,時長默認就行。

創建完成以后在開發機界面可以看到剛剛創建的開發機,點擊進入開發機。

在這里插入圖片描述

進入開發機以后可以看到開發機的主頁面,開發機有三種模式可以選擇:JupyterLab、終端和VScode

在這里插入圖片描述

其中:

  1. JupyterLab:一個交互式的編程和教學環境,同時內置終端,可以很方便地查看文件,執行代碼等
  2. 終端(Terminal, 最輕量級):主要進行命令行操作,或者運行腳本和簡單程序
  3. VSCode:網頁中集成的VSCode,也可以在本地VSCode中通過SSH連接遠程開發,下面就會講如何配置遠程連接。

在這里插入圖片描述

  1. 這個是資源使用情況,在后續的課程中會使用到。

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 noUserKnownHostsFile* /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 直接顯示文件全部內容,moreless 可以分頁查看。
  • 編輯文件:如 vivim 等編輯器。
  • 復制文件:用 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命令的一些常見用法:

  1. 按文件名查找:使用-name選項按照文件名查找文件。例如,find /path/to/directory -name "file.txt"將在指定目錄及其子目錄中查找名為file.txt的文件。
  2. 按文件類型查找:使用-type選項按照文件類型查找文件。例如,find /path/to/directory -type f將查找指定目錄及其子目錄中的所有普通文件。
  3. 按文件大小查找:使用-size選項按照文件大小查找文件。例如,find /path/to/directory -size +100M將查找指定目錄及其子目錄中大于100MB的文件。
  4. 按修改時間查找:使用-mtime-atime-ctime選項按照文件的修改時間、訪問時間或狀態更改時間查找文件。例如,find /path/to/directory -mtime -7將查找指定目錄及其子目錄中在7天內修改過的文件。
  5. 按文件權限查找:使用-perm選項按照文件權限查找文件。例如,find /path/to/directory -perm 755將查找指定目錄及其子目錄中權限為755的文件。
  6. 按用戶或組查找:使用-user-group選項按照文件的所有者或所屬組查找文件。例如,find /path/to/directory -user username將查找指定目錄及其子目錄中屬于用戶username的文件。
  7. 執行操作:使用-exec選項可以對找到的文件執行相應的操作。例如,find /path/to/directory -name "*.txt" -exec rm {} \;將刪除找到的所有以.txt結尾的文件。
3.1.10 ls

ls命令可以用來列出目錄的內容以及詳細信息

常用參數及使用方法如下:

  • -a:顯示所有文件和目錄,包括隱藏文件(以.開頭的文件或目錄)。
  • -l:以長格式顯示詳細信息,包括文件權限、所有者、大小、修改時間等。
  • -h:與-l結合使用,以人類可讀的方式顯示文件大小(如KMG等)。
  • -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  # 列出當前會話的后臺作業
      
  • bgfgbg 將掛起的進程放到后臺運行,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 工具使用

這里介紹一個工具TMUXTMUX 是一個終端多路復用器。它可以在多個終端之間輕松切換,分離它們(這不會殺死終端,它們繼續在后臺運行)和將它們重新連接到其他終端中。為什么要介紹這個工具呢?因為在后面進行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是怎么實現的。

我們會從下面幾部分進行介紹:

  1. conda設置
  2. conda環境管理
  3. conda和pip
  4. 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進行包的安裝的,后面我們會介紹pipconda的區別。

如果我們想要查看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

這部分我們介紹一些condapip的一些區別:

  1. conda可以管理非python包,pip只能管理python包。
  2. conda可以用來創建虛擬環境,pip不能,需要依賴virtualenv之類的包。
  3. conda安裝的包是編譯好的二進制文件,安裝包文件過程中會自動安裝依賴包;pip安裝的包是wheel或源碼,裝過程中不會去支持python語言之外的依賴項。
  4. conda安裝的包會統一下載到當前虛擬環境對應的目錄下,下載一次多次安裝。pip是直接下載到對應環境中。

Wheel 是一種 Python 安裝包的格式。

它是一種預編譯的二進制分發格式,類似于 conda 中的已編譯二進制文件。

Wheel 格式的主要優點包括:

  1. 安裝速度快:因為已經進行了預編譯,所以在安裝時不需要像源碼安裝那樣進行編譯過程,節省了時間。
  2. 一致性:確保在不同的系統和環境中安裝的結果是一致的。

例如,如果您要安裝一個大型的 Python 庫,使用 Wheel 格式可以避免在不同的機器上因為編譯環境的差異而導致的安裝問題。而且,對于那些沒有編譯環境或者編譯能力較弱的系統,Wheel 格式能夠讓安裝過程更加順暢。

4.4 studio-conda使用與Shell(擴展)

這一部分屬于擴展的部分,因為我覺得這一部分非常有趣,也非常實用,所以如果大家有興趣的可以學習一下。

我們先來介紹一下studio-conda,這是開發機內置的一個命令,它通過Shell腳本來實現的。什么是Shell腳本呢?

Shell 腳本 是一種包含一系列命令的文本文件,這些命令按照特定的順序排列,用于在 Unix/Linux 或類似的操作系統環境中自動執行任務。

Shell 腳本通常使用 Shell 語言編寫,常見的 Shell 語言如 Bash、Sh 等,就是我們前面所介紹了Linux基礎命令,這就屬于Shell語言。

它有以下幾個重要特點:

  1. 自動化:可以將一系列重復、復雜的操作編寫為一個腳本,然后只需運行腳本即可自動完成這些操作,從而節省時間和減少錯誤。例如,每天定時備份重要文件的腳本。
  2. 系統管理:用于管理系統配置、用戶權限、進程控制等。比如,創建新用戶并設置其權限的腳本。
  3. 批處理:能夠同時處理多個文件或數據。例如,將一批圖片文件從一種格式轉換為另一種格式的腳本。
  4. 流程控制:像條件判斷(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.py10min
可選任務 1將Linux基礎命令在開發機上完成一遍10min
可選任務 2使用 VSCODE 遠程連接開發機并創建一個conda環境10min
可選任務 3創建并運行test.sh文件10min

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43893.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43893.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43893.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux C embed development (personal rveiew)

1. 如何快速去bring up bcm 的wifi chipset a. 首先的確認 編譯的BSP profile b. 其次要先用 default 的kernel config 去編譯 c. 現在我們的一些 PCIE/GPIO/driver 總線的設置 都在dts 中&#xff0c;有錯就去改dts 2. BCM 的板子bring up 注意事項 a. fw: bcm…

攻防世界 Web_python_template_injection(flask模版注入)

學習文章&#xff1a;https://www.freebuf.com/column/187845.html https://blog.csdn.net/weixin_54515836/article/details/113778233 flask的渲染方法有render_template和render_template_string兩種。 render_template()是用來渲染一個指定的文件的。使用如下 return re…

自學第十五天----深入理解函數上

1. 函數是什么&#xff1f; 維基百科中對函數的定義&#xff1a; 子程序 在計算機科學中&#xff0c;子程序&#xff08;英語&#xff1a;Subroutine, procedure, function, routine, method, subprogram, callable unit&#xff09;&#xff0c;是一個大型程序中的某部分代碼…

python怎么求因數

要想做到python語言求因數方法&#xff0c;首先要明白其中的原理&#xff1a; 1、對由123456789這九個數字組成的9位數進行分解質因數。 2、1234576982x3x3x7x13x23x29x113&#xff0c;所以他的值因數是113。 3、總共有362880種可能&#xff0c;從中找出值因數中最小的數字和…

一節課說明一類奧數題系列——約數與倍數

小學奧數-約數與倍數 約數和倍數&#xff1a;若整數 a 能夠被 b 整除&#xff0c;a 叫做 b 的倍數&#xff0c;b 就叫做 a 的約數。 公約數&#xff1a;幾個數公有的約數&#xff0c;叫做這幾個數的公約數&#xff1b;其中最大的一個叫做這幾 個數的最大公約數。a,b兩數的最…

學生宿舍反限電插座控制功能

石家莊光大遠通電氣有限公司反限電插座功能的技術防止學生通過半波整流進行防止學生改變負載特性(阻性變為非阻性)的防止學生通過可控硅調壓技術(進行功率調整達到使用目的)惡性負載限制次數設置:管理部門可以根據實際要求設定每個宿舍違規次數。達到本次數。系統自動鎖定&…

【LeetCode】快樂數

目錄 一、題目二、解法完整代碼 一、題目 編寫一個算法來判斷一個數 n 是不是快樂數。 「快樂數」 定義為&#xff1a; 對于一個正整數&#xff0c;每一次將該數替換為它每個位置上的數字的平方和。 然后重復這個過程直到這個數變為 1&#xff0c;也可能是 無限循環 但始終變…

Linux:Ubuntu18.04下開機自啟動QT圖形化界面

Linux&#xff1a;Ubuntu18.04下開機自啟動QT圖形化界面 Chapter1 Linux&#xff1a;Ubuntu18.04下開機自啟動QT圖形化界面一、創建rc.local文件二、建立rc-local.service文件三、啟動服務查看啟動狀態四、重啟 Chapter2 將QT應用作為開機自啟動&#xff08;Linux系統&#xff…

代碼能力弱,編程思維幾乎沒有,有些勉強能看懂,讓自己敲,一臉懵逼?

最近有幾個人問我&#xff0c;說自己代碼能力弱&#xff0c;編程思維幾乎也沒有&#xff0c;簡單的代碼&#xff0c;勉強能看懂&#xff0c;讓自己敲&#xff0c;就一臉懵逼&#xff0c;下一步該怎么學習&#xff1f; 10幾年前&#xff0c;這些問題&#xff0c;就像是一道道難以…

Redis數據結構和持久化

數據類型 String&#xff1a;Map<String,String> 命令格式 set key value(相同的key會覆蓋&#xff09; get key incr key decr key setex key seconds value seconds秒后失效 ttl key del key setnx ke value(if not exist) 應用場景 計數器 比如&#xff1a;訪問次…

1招搞定maven打包空間不足問題

目錄 一、工具應用問題 二 、使用效果 三、使用方法 四、練習手段 一、工具應用問題 使用maven的package功能打包失敗&#xff0c;報錯“Java heap space”錯誤。 二 、使用效果 修改IDEA中maven內存使用大小后&#xff0c;打包成功。 三、使用方法 點擊菜單“File->Set…

C++ 例外處理 try throw catch

例外處理 程式中可能會發生的錯誤有三種&#xff0c;分別是語法錯誤(syntax error) 、執行期間錯誤(runtime error) 及語意錯誤(semantic error) &#xff0c;其中編譯器會直接檢查出語法錯誤&#xff0c;如果含有語法錯誤的程式無法過編譯&#xff0c;例如 $ g u06.cpp u06.c…

【PythonRS】基于Python分塊處理大型遙感影像的方法

RSer工作時不可避免會用到大型的遙感影像,由于分辨率過高、區域過大、波段信息過多等原因,都會導致數據非常的大。這個時候我們在進行一些簡單的操作,如計算NDVI、二值化、分類等時,計算機的內存都會溢出。因此今天跟大家分享一下我平時分塊的方法,中間如何計算就按照自己…

Docker 使用基礎(3)—容器

&#x1f3ac;慕斯主頁&#xff1a;修仙—別有洞天 ??今日夜電波&#xff1a;秒針を噛む—ずっと真夜中でいいのに。 0:34━━━━━━?&#x1f49f;──────── 4:20 &#x1f504; ?? ? …

let/const/var的區別及理解

在JavaScript中&#xff0c;let、const 和 var 是用來聲明變量的關鍵字&#xff0c;但它們之間在作用域、變量提升、重復聲明等方面存在區別&#xff0c;詳細情況如下: 1. let、const、var 的區別 (1) 塊級作用域 let 和 const&#xff1a;具有塊級作用域&#xff0c;由 {} 包…

百數教學秘籍:三步走,輕松規劃你的自動化計劃任務

通過設定任務計劃&#xff0c;用戶可以輕松安排指定的功能插件或數據助手在特定時間自動執行&#xff0c;有效提高工作效率&#xff0c;還確保了數據的及時更新和處理。任務計劃在應用啟動時自動啟動并在后臺運行&#xff0c;無需用戶持續監控&#xff0c;為用戶帶來極大的便利…

oracle哪些后臺進程不能殺?

oracle 有很多的后臺進程&#xff0c;在遇到特殊情況的時候如鎖表&#xff0c;如果等待的是一個后臺進程&#xff0c;那這時就需要考量是不是能殺掉這個后臺進程&#xff1f;殺掉這個后臺進程會不會引起實例崩潰&#xff1f;本著實踐出真知&#xff0c;本文針對oracle 11g&…

游戲開黑語音-使用云服務器部署teamspeak服務(系統Ubuntu 20.04 LTS)

目錄 前置物品服務器調整及部署1.重裝系統2.換源3.下載teamspeak服務端并部署 連接服務器參考 前置物品 一臺云服務器&#xff08;系統&#xff1a;Ubuntu 20.04 LTS) 服務器調整及部署 1.重裝系統 在騰訊云官網的主機控制臺內&#xff0c;選擇重裝系統 (由于之前為了快點和…

【刷題匯總 -- 最長回文子串、買賣股票的最好時機(一)、[NOIP2002 普及組] 過河卒】

C日常刷題積累 今日刷題匯總 - day0101、最長回文子串1.1、題目1.2、思路1.3、程序實現 2、買賣股票的最好時機(一)2.1、題目2.2、思路2.3、程序實現2.4、程序實現 -- 優化 3、[NOIP2002 普及組] 過河卒3.1、題目3.2、思路3.3、程序實現 -- dp 4、題目鏈接 今日刷題匯總 - day0…

Excel中用VBA實現Outlook發送當前工作簿

Excel中用VBA實現Outlook發送當前工作簿&#xff0c;首先按AltF11打開VBA編輯器&#xff0c;插入模塊&#xff0c;并在工具-引用中勾選 Microseft Outlook .0 Object Library(其中為你Microseft Outlook的版本號。 Sub 發送郵件() 保存當前excel ThisWorkbook.Save讓excel連接…