Compartilhamento de tecnologia

Nível 1: Conhecimento básico de Linux

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Prefácio

Este artigo são as notas do terceiro campo de prática modelo em grande escala para acadêmicos organizado pelo Laboratório de Inteligência Artificial de Xangai. Ele é apenas para referência de indivíduos e assistentes de ensino ao corrigir o dever de casa.Link original do tutorial
Para se registrar, pesquise "The Third Scholar Model Practice Camp" no WeChat.
Esta nota é uma nota anotada pessoalmente e modificada com base no tutorial original.

Nível Linux + InternStudio

😀Hello大家好,欢迎来到Modelo acadêmico grandeAcampamento prático, aqui está um curso básico preparado pelo acampamento prático para alunos que estão participando do acampamento prático pela primeira vez e alunos de diversos setores que não possuem conhecimentos básicos de Linux.Máquina de desenvolvimento InternStudioe domine alguns princípios básicosConhecimento Linux , para que todos não tenham ideia de por onde começar nos cursos a seguir, espero que seja útil para todos. Preparamos algumas tarefas de nível para você nas tarefas de nível aqui. Ao concluir as tarefas de nível exigidas e fazer o check-in, você receberá a recompensa de poder de computação do nível atual.vamos começar!

1. Introdução à máquina de desenvolvimento InternStudio

InternStudio 是大模型时代下的云端算力平台。基于 InternLM 组织下的诸多算法库支持,为开发者提供开箱即用的大语言模型微调环境、工具、数据集,并完美兼容 🤗 HugginFace 开源生态。

Se quiser saber mais sobre o InternStudio, você pode conferir os seguintes documentos: EstagiárioEstúdio

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

Primeiro abra o link acima para entrar no InternStudio. Após fazer o login, você irá automaticamente para a interface do console, conforme mostrado na figura abaixo:

Insira a descrição da imagem aqui

Deixe-me contar as funções das páginas correspondentes a cada número de série:

  1. Aqui você pode criarMáquina de desenvolvimento, bem como modificar a configuração da máquina de desenvolvimento e visualizar logs relacionados, etc.

Insira a descrição da imagem aqui

  1. tudo bem aquiVisualização Visualize os arquivos e pastas na máquina de desenvolvimento. Se você criar duas máquinas de desenvolvimento, elas usarão o mesmo disco na nuvem. (Como cada máquina de desenvolvimento é um contêiner Docker, um disco de armazenamento em nuvem é montado. Para explicações sobre termos profissionais, consulte: Explicação de termos profissionais) Aqui você pode fazer upload de arquivos ou pastas, criar arquivos e visualizar arquivos ocultos.

Insira a descrição da imagem aqui

  1. Esta é uma nova função da máquina de desenvolvimento. Se você quiser fazer um projeto, pode solicitar recursos do assistente. A função da equipe é para todos os membros.Recursos de computação compartilhados,避免造成资源浪费。(毕竟烧的可都是💴啊)
  2. Isto é usado para configurarChave SSH, falaremos sobre como usá-lo mais tarde.
  3. O último lugar é para editar suas informações pessoais e verificar seuRecursos de computaçãouso específico.

O texto acima é uma breve introdução à plataforma InternStudio. Vamos dar uma olhada em como criar uma máquina de desenvolvimento. Vamos para a página inicial e clicamos em ".Crie uma máquina de desenvolvimento

Insira a descrição da imagem aqui

Aqui escolhemos criarmáquina de desenvolvimento pessoal, nomeadotesteCudaA versão é 12.2,Alocação de recursosSelecione 10% e a duração padrão está correta.

Após a conclusão da criação, emMáquina de desenvolvimentoVocê pode ver a máquina de desenvolvimento que acabou de criar na interface. Clique para entrar na máquina de desenvolvimento.

Insira a descrição da imagem aqui

Depois de entrar na máquina de desenvolvimento, você pode ver a página principal da máquina de desenvolvimento. A máquina de desenvolvimento tem três modos para escolher:JupyterLab, Terminal e VScode

Insira a descrição da imagem aqui

em:

  1. Laboratório Jupyter: Um ambiente interativo de programação e ensino com um terminal integrado que pode facilmente visualizar arquivos, executar código, etc.
  2. terminal(Terminal, o mais leve): Usado principalmente para operações de linha de comando ou execução de scripts e programas simples
  3. Código VSC: O VSCode integrado na página web também pode ser desenvolvido remotamente através da conexão SSH no VSCode local. A seguir será explicado como configurar a conexão remota.

Insira a descrição da imagem aqui

  1. Este é o uso de recursos, que será usado em cursos subsequentes.

2. SSH e mapeamento de portas

Apresentamos acimaPlataforma InternStudioe como criar uma máquina de desenvolvimento Nesta seção, queremos entender o que.SSHPor que usar conexão remota, Como usar SSHconexão remotaMáquina de desenvolvimento, o que éMapeamento de portase como procederMapeamento de portas

2.1 O que é SSH?

SSHO nome completo é Secure Shell, que é traduzido para chinês como shell seguro.protocolo de segurança de rede , realize acesso seguro e transferência de arquivos e outros serviços por meio de mecanismos de criptografia e autenticação. O protocolo SSH fornece serviços de rede seguros em um ambiente de rede inseguro, criptografando e autenticando dados de rede.

SSH é (arquitetura C/S) porservidoreclientePara estabelecer um canal SSH seguro, ambas as partes precisam primeiro estabelecer uma conexão TCP, depois negociar o número da versão e vários algoritmos usados, e gerar o mesmochave de sessão usado para criptografia simétrica subsequente. Após completar a autenticação do usuário, ambas as partes podem estabelecer uma sessão para troca de dados.

Então, na prática subsequente, iremosConfigurar chaves SSH, a chave de configuração é para que não tenhamos que digitar a senha repetidamente quando nos conectamos remotamente à máquina de desenvolvimento, entãoPor que conectar-se remotamente?

A vantagem da conexão remota é que, se você estiver usando um escritório remoto, poderá se conectar remotamente à máquina de desenvolvimento por meio de SSH, para poder desenvolver localmente. E se você precisar rodar algum código local e não tiver um ambiente, então a conexão remota é muito necessária.

2.2 Como usar SSH para conectar-se remotamente à máquina de desenvolvimento?

2.2.1 Usar senha para conexão remota SSH

Primeiro, usamos o método de inserção da senha para conexão remota SSH. Mais tarde falaremos sobre como configurar o login sem senha.

Após concluir a criação da máquina de desenvolvimento, precisamos abrir o terminal powerShell do nosso computador e usarWin+R Use a tecla de atalho para abrir a caixa de execução, digite powerShell e abra o terminal powerShell. (Se você estiver executando o sistema operacional Linux ou Mac, as etapas a seguir são as mesmas)

Voltamos à plataforma da máquina de desenvolvimento e entramosMáquina de desenvolvimentoEncontre a máquina de desenvolvimento que criamos na página e cliqueConexão SSH

Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

então copieComando de login, 37367 aqui é a porta SSH usada pela máquina de desenvolvimento. Geralmente, a porta 22 é usada. Sem esse número de porta, você não pode se conectar ao SSH e a porta de cada pessoa é diferente, portanto, se você estiver se conectando à máquina de desenvolvimento, se você não conseguir se conectar. , você precisa verificar se a porta está errada.

Cole o comando copiado no PowerShell e pressione Enter. Aqui precisamos inserir a senha. Copiamos a senha no comando de login e colamos no terminal.Observe que após copiar a senha, clique com o botão direito para colá-la. A tecla de atalho do shell para colar em alguns computadores é.shift+ins, a senha colada aqui não será exibida, isso é normal.

Por fim, pressione Enter e o seguinte conteúdo aparecerá, indicando sucesso:

Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

Depois de nos conectarmos à máquina de desenvolvimento, podemos usarhostnamePara visualizar o nome da máquina de desenvolvimento, useuname -aPara visualizar as informações do kernel da máquina de desenvolvimento, uselsb_release -aPara visualizar informações de versão da máquina de desenvolvimento, usenvidia-smiVerifique as informações da GPU. Falaremos sobre esses comandos mais tarde. Se quiser sair da conexão remota, digite-o duas vezes.exitÉ isso.

2.2.2 Configurar chave SSH para conexão remota SSH

Mas quando desenvolvemos e estudamos, é difícil inserir a senha remotamente. Podemos definir a chave SSH para pular a etapa de digitação da senha.gerador de chaves sshcomando para gerar a chave

A chave SSH é um método de autenticação de login seguro e conveniente, usado para autenticação e comunicação criptografada no protocolo SSH.

gerador de chaves sshSuporta chaves de autenticação RSA e DSA.

Os parâmetros comumente usados ​​incluem:

  • -t: Especifique o tipo de chave, como dsa, ecdsa, ed25519, rsa.
  • -b: Especifique o comprimento da chave.
  • -C: Adicione comentários.
  • -f: Especifique o nome do arquivo para salvar a chave.
  • -i: Leia arquivos de chave pública/privada compatíveis com ssh-v2 não criptografados.

Aqui usamos o algoritmo RSA para gerar a chave, o comando é:

ssh-keygen -t rsa
  • 1

Depois de inserir o comandoEntre até o fimÉ isso, a chave aqui é gerada por padrão em~/.ssh/sob o diretório,~Significa o diretório inicial, se for Windows, éC:Users{your_username} .Pode ser usado no PowerShellGet-ContentComando para visualizar a chave gerada, que pode ser utilizada caso seja um sistema operacional LinuxcatOrdem.

Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

Depois voltamos para a plataforma da máquina de desenvolvimento e clicamos em Configuração na página inicialChave SSH, então cliqueAdicionar chave pública SSH

Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

Copie a chave que você acabou de gerar e cole-a na caixa de chave pública. O nome será reconhecido automaticamente. Por fim, clique em Adicionar agora e a configuração da chave SSH estará concluída.

Insira a descrição da imagem aqui

Após concluir a criação da chave SSH, reinicieterminalAo conectar-se remotamente, a etapa de digitação da senha será ignorada.

2.2.3 Use VScode para conexão remota SSH

Claro, você também pode usar software de conexão remota SSH, como:Termo de vento, terminal X espere. Aqui usamos VScode para conexão remota. A vantagem de usar VScode é que ele é um editor de código, muito conveniente para modificação de código e outras operações.

Se quisermos nos conectar remotamente no VScode, também precisamos instalar um conjunto de plug-ins. Você pode pesquisar online como instalar o VScode. (O vscode na máquina de desenvolvimento não pode procurar este plug-in, mas o vscode local pode)

Insira a descrição da imagem aqui

Se você instalou o VScode, pode clicar na página de extensão à esquerda e digitar “SSH” na caixa de pesquisa. O primeiro é o plug-in que queremos instalar.

Insira a descrição da imagem aqui

Após instalar o plug-in, clique no ícone de conexão remota na barra lateral, clique no botão "+" no SSH e adicione o comando de login para a conexão SSH da máquina de desenvolvimento.

Insira a descrição da imagem aqui

Copiamos o comando de login, colamos o comando na janela pop-up e, finalmente, pressionamos Enter:

Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

O arquivo de configuração padrão é adequado. Claro, você também pode personalizá-lo. A seguir está o conteúdo específico do arquivo de configuração: (Isso inclui todas as informações de sua conexão remota).

Host ssh.intern-ai.org.cn #主机ip也可以是域名
  HostName ssh.intern-ai.org.cn #主机名
  Port 37367 #主机的SSH端口
  User root #登录SSH使用的用户
  StrictHostKeyChecking no
  UserKnownHostsFile /dev/null
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Se você quiser adicionar manualmente algumas das seguintes opções de configuração, será necessário modificar as partes correspondentes de acordo com o formato acima.

Se *StrictHostKeyChecking noeUserKnownHostsFile* /dev/nullExclua a janela pop-up que aparecerá para verificação de impressão digital:

Insira a descrição da imagem aqui

StrictHostKeyChecking no Indica que a verificação estrita da chave do host está desabilitada. Isto significa que ao conectar-se a um novo servidor SSH, a chave de host do servidor não será rigorosamente verificada, o que pode representar um certo risco de segurança.

UserKnownHostsFile /dev/nullEle define o arquivo de chave do host conhecido pelo usuário como /dev/null, o que essencialmente ignora a gravação e o uso de chaves de host conhecidas.

No entanto, na prática geral de segurança, não é recomendado desabilitar arbitrariamente a verificação estrita da chave do host.

Em seguida, clique em “Conectar” na janela de prompt que aparece no canto inferior direito para conectar-se remotamente à máquina de desenvolvimento.

Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

Após a conexão remota ser concluída, você pode escolher a pasta a ser aberta, que também pode ser chamada de diretório de trabalho. Você pode escolher a pasta na máquina de desenvolvimento ou a pasta local na máquina de desenvolvimento.disco de nuvem

Na próxima vez que você fizer uma conexão remota, não precisará inserir comandos de login e outras informações. Você só precisa abrir a conexão remota do vscode para ver as informações da máquina de desenvolvimento da primeira conexão, como segue.rootIsso significa que quando nos conectamos pela primeira vez à máquina de desenvolvimento, usamos/rootLista de trabalho.

Insira a descrição da imagem aqui

E na foto abaixo->Indica que você precisa selecionar novamente o diretório de trabalho após entrar na máquina de desenvolvimento:

Insira a descrição da imagem aqui

E na foto abaixo->Indica a entrada no diretório de trabalho selecionado pela última máquina de desenvolvimento:

Insira a descrição da imagem aqui

O diretório de trabalho selecionado a cada vez será exibido nas informações da máquina de desenvolvimento: (há um diretório de trabalho adicional para lagent aqui)

Insira a descrição da imagem aqui

A seguir apresentaremos quandoMapeamento de portas

2.3. Mapeamento de portas

2.3.1 O que é mapeamento de portas?

Mapeamento de portas É uma tecnologia de rede que pode mapear qualquer porta da rede externa para a porta correspondente na rede interna para realizar a comunicação entre a rede interna e a rede externa. Através do mapeamento de portas, os serviços ou aplicações na intranet podem ser acessados ​​a partir da rede externa para alcançar uma comunicação conveniente através da rede.

Então, por que precisamos realizar o mapeamento de portas ao usar uma máquina de desenvolvimento?

Porque nos cursos subsequentes realizaremos modelosdemonstração_web Na prática de implantação, durante esse processo, é provável que você encontre o problema de carregamento incompleto da interface da web.Isso ocorre porque ao executar web_demo na máquina de desenvolvimento Web IDE, acessar diretamente o serviço http/https na máquina de desenvolvimento pode encontrar problemas de proxy.recursos da interface do usuárioNão carregado completamente.

Então, para resolver esse problema, precisamos mapear a porta da conexão executando web_demo, eLinks de rede externos são mapeados para nosso host local , usamos acesso de conexão local para resolver esse problema de proxy. Vamos praticar agora.

Insira a descrição da imagem aqui

Vamos primeiro entender como funciona o mapeamento de portas da máquina de desenvolvimento com base em um diagrama:

Abaixo estão etapas práticas. Primeiro, entenda como realizar o mapeamento de portas.

ssh -p 37367 [email protected] -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyChecking=no
  • 1

O acima é um comando de mapeamento de porta. Execute este comando no host para realizar o mapeamento de porta. Aqui está um fluxograma para entender o processo de mapeamento de porta:

Insira a descrição da imagem aqui

O PC pessoal se conectará remotamente à única porta exposta 37367 da máquina de desenvolvimento (isso é mencionado durante o SSH, e a porta exposta de cada máquina de desenvolvimento é diferente) e definirá as opções de túnel. A porta exposta serve como estação de trânsito para encaminhamento de tráfego.

  • -C: habilite a compactação para reduzir a quantidade de dados transferidos.
  • -N: Não executa comandos remotos, apenas estabelece túneis.
  • -g: permite que hosts remotos se conectem a portas encaminhadas localmente.

Quando este comando SSH é executado em um PC pessoal, o cliente SSH escutará na porta 7860 da máquina local.

Qualquer tráfego enviado para a porta local 7860 será encaminhado pelo túnel SSH para a porta 7860 no endereço 127.0.0.1 do servidor remoto.

Isso significa que mesmo que esta porta da máquina de desenvolvimento não esteja diretamente exposta à rede externa, podemos acessar com segurança os serviços no servidor remoto através deste túnel. .

2.3.2 Como realizar o mapeamento de portas?
2.3.2.1 Use o comando ssh para mapeamento de portas

Ainda vamos para a interface da máquina de desenvolvimento, encontramos nossa máquina de desenvolvimento e clicamosServiços personalizados, copie o primeiro comando,
Insira a descrição da imagem aqui

ssh -p 37367 [email protected] -CNg -L {本地机器_PORT}:127.0.0.1:{开发机_PORT} -o StrictHostKeyChecking=no
  • 1

Vamos apresentar a ele o significado de cada parte do comando:

  • -p 37367: especifica a porta para conexão SSH para 37367, mencionada anteriormente.
  • [email protected]: Indica usar root A identidade do usuário se conecta assh.intern-ai.org.cn este anfitrião.
  • -CNg
    • -C Normalmente usado para ativar a compactação.
    • -N Indica que os comandos remotos não são executados, mas apenas conexões são estabelecidas para encaminhamento de porta, etc.
    • -g Permitir que hosts remotos se conectem a portas encaminhadas localmente.
  • -L {本地机器_PORT}:127.0.0.1:{开发机_PORT}: Isto serve para configurar o encaminhamento de porta local para encaminhar a porta especificada da máquina local (por {本地机器_PORT} representa) encaminhado para o host remoto (aqui, ou seja,ssh.intern-ai.org.cn)de 127.0.0.1 (ou seja, o endereço de loopback local) e a porta da máquina de desenvolvimento especificada (definida por{开发机_PORT} expressar).
  • -o StrictHostKeyChecking=no: desative a verificação estrita de chave de host para evitar avisos ou erros devido a chaves de host desconhecidas ao conectar-se pela primeira vez.

Ao executar uma demonstração na web, você pode usar este comando para realizar o mapeamento de portas, por exemplo:

Criamos um arquivo hello_world.py (clique com o botão direito na interface da máquina de desenvolvimento para criar o arquivo e altere o nome para hello_world.py) e preencha o seguinte conteúdo no arquivo:

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

Lembre-se depois de editarctrl+ssalvar

Antes de executar o código, você precisa usarpip install gradio==4.29.0Comando para instalar os seguintes pacotes de dependência (copie e cole o comando no terminal) e, em seguida, execute um no terminal do Web IDEpython hello_world.pyOrdem

Insira a descrição da imagem aqui

Se o mapeamento da porta não for realizado, ela não poderá ser acessada usando IP local.

Insira a descrição da imagem aqui

Posso inserir isso no PowerShell usando o seguinte comando:

ssh -p 37367 [email protected] -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyChecking=no
  • 1

Insira a descrição da imagem aqui

Isso representa sucesso. (Perceber: Este comando não retorna nenhum conteúdo, o que significa que o mapeamento da porta está em execução, e então você pode ver a interface da interface web abrindo a conexão na página web)

Insira a descrição da imagem aqui

2.3.2.2 Use vscode para mapeamento de portas

Claro, se executarmos diferentes UIs da web, precisaremos inserir comandos repetidamente, o que é muito problemático, e precisamos usar o VScode.Conectamos a máquina de desenvolvimento remotamente via SSH. O VScode fornece mapeamento automático de portas. Não precisamos configurá-lo manualmente. Podemos usar a tecla de atalho "Ctrl+Shift+~".Acorde o terminal, as opções de porta podem ser encontradas no lado direito do terminal:

Insira a descrição da imagem aqui

Aqui você pode visualizar as informações de mapeamento da porta. Se precisar modificar a porta, você pode modificar o número da porta na coluna da porta.

3. Comandos básicos do Linux

Nesta parte, vou levar você a entender um pouco do LinuxOperações básicas e use algumas ferramentas. Para que todos possam resolver sozinhos quando encontrarem problemas. Se encontrar algum problema, você também pode comentar aqui e eu responderei a tempo.

porque usamosMáquina de desenvolvimentoRaramente usadogestão de autoridade , então não vamos apresentá-lo. (As operações a seguir são todas realizadas no terminal VScode)

3.1 Gerenciamento de arquivos

No Linux, as operações comuns de gerenciamento de arquivos incluem:

  • Crie um arquivo:pode usar touch comando cria um arquivo vazio.
  • Crie um diretório:usar mkdir Ordem.
  • Troca de diretório:usarcdOrdem.
  • Mostrar diretório:usarpwdOrdem.
  • Ver o conteúdo do arquivo: Se usado cat Exibir diretamente todo o conteúdo do arquivo,more eless Pode ser visualizado em páginas.
  • Editar arquivo:como vi ouvim Aguarde o editor.
  • Copiar arquivos:usar cp Ordem.
  • Criar link de arquivo:usarlnOrdem.
  • Mover arquivos:passar mv Ordem.
  • Deletar arquivos:usar rm Ordem.
  • excluir diretóriormdir(Apenas diretórios vazios podem ser excluídos) ou rm -r(Diretórios não vazios podem ser excluídos).
  • Encontre arquivos:Pode usar find Ordem.
  • Ver detalhes de um arquivo ou diretório:usarlscomando, como usar ls -lVeja informações detalhadas sobre arquivos em um diretório.
  • Processar arquivos: Para operações complexas de arquivos, você pode usarsedOrdem.

Aqui estão vários comandos que usaremos no curso:

3.1.1 tocar

Podemos usar o toque para criar arquivos rapidamente, sem precisar clicar manualmente para criá-los.Por exemplo, queremos criar umdemo.pydocumento:

3.1.2 mkdir

Da mesma forma, se você deseja criar um arquivo chamadotestDiretório:

Insira a descrição da imagem aqui

3.1.3 cd

Este comando será o comando mais comumente usado. Antes de usá-lo, você precisa explicar a estrutura de diretórios para alunos que não possuem conhecimentos de informática e fazer um desenho para que todos possam entender:

Insira a descrição da imagem aqui

O que estamos usando agora érootdiretório, que também é o diretório inicial do usuário root.~, no sistema operacional Linux/Representa o diretório raiz. Existem muitos diretórios e arquivos exigidos pelo sistema no diretório raiz. O diretório que acabamos de criar existe.rootdiretório, entre os quais.Representa o diretório atual,.. O diretório pai representado.Se eu entrasse agoratestdiretório e depois retornar pararootDiretório, podemos fazer isso:

3.1.4 Pcd

podemos usarpwdComando para visualizar o diretório atual: Isso torna mais fácil determinar em qual diretório estamos atualmente.

Insira a descrição da imagem aqui

3.1.5 gato

catO comando pode visualizar o conteúdo do arquivo e mais comandos podem ser usados--helpComando para visualizar:

  • -a, --show-all é equivalente a -vET
  • -b, –number-número não em branco de linhas de saída não vazias, substitui -n
  • -e, equivalente a -vE
  • -E, --show -end exibe $ no final de cada linha
  • -n, --number número todas as linhas de saída
  • -s, --crick-blank suprime linhas de saída vazias repetidas
  • -t é equivalente a -vT
  • -t, --show-tabs exibe caracteres de tabulação como ^I
  • -v, --show não impressão usa notação ^ e M, exceto LFD e TAB
3.1.6 vi ou vim

Podemos usá-lo quando precisarmos editar arquivosviouvimcomando, quando você entra na edição de arquivo, existem três modos:

Insira a descrição da imagem aqui

Entre no modo de edição para usari, a conveniência do vim é que você pode fazer modificações simples em arquivos no terminal.

3.1.7 cp e ln (ênfase)

**cp**O comando será usado com frequência nos seguintes cursos. Ele é usado para copiar um arquivo ou diretório para outro diretório. Os usos comuns incluem:

  • Copiar arquivos:cp 源文件 目标文件
  • Copiar diretório:cp -r 源目录 目标目录

Mas se quisermos usar o modelo, esta operação ocupará muito espaço em disco, por isso geralmente usamosln comando, é igual ao atalho do Windows. Existem dois tipos de links no Linux:link físico(link físico) comlink virtual (link simbólico), um link físico significa que um arquivo pode ter vários nomes, enquanto um link simbólico gera um arquivo especial cujo conteúdo aponta para a localização de outro arquivo. Os links físicos existem no mesmo sistema de arquivos, mas os links físicos podem abranger sistemas de arquivos diferentes.

Portanto, geralmente usamos conexões suaves. Seus métodos de uso comuns são os seguintes:

ln [参数][源文件或目录][目标文件或目录]
  • 1

Os parâmetros são os seguintes:

  • -s: Criar links simbólicos (links simbólicos) também é o mais comumente usado;
  • -f: Força a execução, sobrescreve os arquivos de destino existentes;
  • -i: Modo interativo, se o arquivo existir, o usuário será questionado se deseja sobrescrevê-lo;
  • -n: trata links simbólicos como diretórios gerais;
  • -v: Exibe o processamento detalhado.
3.1.8 mv e rm

mvcomando ermOs comandos são usados ​​de maneira semelhante, masmvEle é usado para mover arquivos ou diretórios e também pode ser renomeado.rmO comando é usado para excluir arquivos ou diretórios.

Os métodos comumente usados ​​são os seguintes:

  • comando mv

Parâmetros comumente usados:

  • -i: Modo interativo, pergunte antes de substituir.
  • -f: Forçar cobertura.
  • -u: mova apenas se o arquivo de origem for mais recente que o arquivo de destino.

Exemplo de uso:

  • mv file1.txt dir1/: mova o arquivo file1.txt Mover para o diretóriodir1 meio.

  • mv file1.txt file2.txt: mova o arquivo file1.txt Renomear parafile2.txt

  • comando rm

Parâmetros comumente usados:

  • -i: Modo interativo, pergunte antes de excluir.
  • -f: exclusão forçada, ignorando arquivos inexistentes, sem solicitar confirmação.
  • -r:Exclui recursivamente um diretório e seu conteúdo.

Exemplo de uso:

  • rm file.txt:Deletar arquivos file.txt
  • rm -r dir1/: Excluir diretórios recursivamente dir1 e todo o seu conteúdo.

O comando para excluir um diretório também pode ser usadormdir

3.1.9 encontrar

findO comando é uma ferramenta poderosa de pesquisa de arquivos no sistema Linux. Ele pode encontrar arquivos ou diretórios que atendam às condições no diretório especificado e seus subdiretórios e executar as operações correspondentes.

A seguirfindAlguns usos comuns do comando:

  1. Localizar por nome de arquivo:usar-name opção para localizar arquivos por nome de arquivo. Por exemplo,find /path/to/directory -name "file.txt"irá pesquisar o diretório especificado e seus subdiretórios nomeadosfile.txtdocumento.
  2. Localizar por tipo de arquivo:usar-type opção para localizar arquivos por tipo de arquivo. Por exemplo,find /path/to/directory -type fTodos os arquivos comuns no diretório especificado e seus subdiretórios serão encontrados.
  3. Localizar por tamanho de arquivo:usar-size opção para localizar arquivos por tamanho de arquivo. Por exemplo,find /path/to/directory -size +100MEncontrará arquivos maiores que 100 MB no diretório especificado e em seus subdiretórios.
  4. Pesquise por horário de modificação:usar-mtime-atimeou-ctime As opções encontram arquivos com base na hora de modificação, hora de acesso ou hora de mudança de status. Por exemplo,find /path/to/directory -mtime -7Encontrará arquivos no diretório especificado e seus subdiretórios que foram modificados em 7 dias.
  5. Localizar por permissões de arquivo:usar-perm opção para localizar arquivos com base nas permissões de arquivo. Por exemplo,find /path/to/directory -perm 755Encontrará arquivos com permissão 755 no diretório especificado e seus subdiretórios.
  6. Encontre por usuário ou grupo:usar-userou-group As opções encontram arquivos por proprietário ou grupo. Por exemplo,find /path/to/directory -user usernameIrá pesquisar o diretório especificado e seus subdiretórios pertencentes ao usuáriousernamedocumento.
  7. realizar operações:usar-exec As opções podem realizar operações correspondentes nos arquivos encontrados. Por exemplo,find /path/to/directory -name "*.txt" -exec rm {} ;excluirá todos os encontrados terminando com.txtarquivo no final.
3.1.10 eu

lsO comando pode ser usado para listar o conteúdo de um diretório, bem comodetalhes

Os parâmetros e métodos de uso comumente usados ​​são os seguintes:

  • -a: Exibe todos os arquivos e diretórios, incluindo arquivos ocultos (além.arquivo ou diretório que começa com .).
  • -l: Exibe informações detalhadas em formato longo, incluindo permissões de arquivo, proprietário, tamanho, hora da modificação, etc.
  • -h:e-lUsado em combinação para exibir o tamanho do arquivo de maneira legível (por exemplo,KMGespere).
  • -R: lista o conteúdo dos subdiretórios recursivamente.
  • -t : Exibe na ordem do horário de modificação do arquivo. ,

Insira a descrição da imagem aqui

3.1.11 sentado

sedCommand é um editor de fluxo, usado principalmente para processamento de texto. É frequentemente usado no processamento de operações complexas de arquivos.sedOs parâmetros comumente usados ​​e exemplos de uso de comandos são os seguintes:

  • Descrição do parâmetro:
    • -e<script> ou--expression=<script>: especifique scripts diretamente na linha de comando para processamento de texto.
    • -f<script文件> ou--file=<script文件>: leia o script do arquivo de script especificado para processamento de texto.
    • -n ou--quiet ou--silent: imprima apenas os resultados de saída processados ​​pelo script e não imprima linhas sem correspondência.
  • Descrição da ação:
    • a: adicione a sequência de texto especificada à próxima linha da linha atual.
    • c: substitui o intervalo de linhas especificado pela sequência de texto especificada.
    • d: Exclua a linha especificada.
    • i: adicione a sequência de texto especificada à linha anterior da linha atual.
    • p : Imprima as linhas selecionadas.geralmente com-n Usado junto com os parâmetros, apenas as linhas correspondentes são impressas.
    • s : use expressões regulares para substituição de texto. Por exemplo,s/old/new/g Substitua todos os "InternLM" por "InternLM yyds".
  • Exemplo:

Insira a descrição da imagem aqui

usado no exemploechocomando, é o mesmo que em pythonprintO mesmo, usado para imprimir conteúdo, aqui use a barra vertical>Imprimir InternLM em um arquivo Os caracteres de pipe comumente usados ​​incluem.<e|, por exemplo podemos usargrepComando para visualizar as inclusões instaladas em pythonosPacote de campo:

Insira a descrição da imagem aqui

grep É uma poderosa ferramenta de pesquisa de texto. Os parâmetros comumente usados ​​são os seguintes:

  • -i: Pesquise independentemente do caso.
  • -v: Inverte a correspondência, ou seja, exibe linhas sem correspondência.
  • -n: Exibe o número da linha.
  • -c: conte o número de linhas correspondentes.

3.2 Gestão de processos

Gerenciamento de processosOs comandos são ferramentas importantes para monitoramento do sistema e gerenciamento de processos. Os comandos de gerenciamento de processos comumente usados ​​incluem o seguinte:

  • ps: Ver processos em execução
  • principal:Exibição dinâmica de processos em execução
  • pstree: Visualize os processos em execução na visualização em árvore
  • pgrep: usado para encontrar processos
  • legal:Alterar a prioridade de um processo
  • empregos: Exibe informações relacionadas ao processo
  • bg e fg: Mova o processo para segundo plano
  • matar: matar processo

Também existe um comando especial na máquina de desenvolvimentonvidia-smi , que é uma ferramenta de linha de comando para a interface de gerenciamento de sistema NVIDIA, usada para monitorar e gerenciar dispositivos GPU NVIDIA. Ele fornece uma maneira rápida de visualizar informações como status da GPU, uso, temperatura, uso de memória, uso de energia e processos em execução na GPU.

A seguir estão exemplos de uso de cada comando:

  • ps : Liste os processos no sistema atual. Diferentes informações do processo podem ser exibidas usando diferentes opções, como:
    • ps aux  # 显示系统所有进程的详细信息
      
      • 1
  • top : exibe dinamicamente o status dos processos no sistema. Ele atualiza a lista de processos em tempo real, mostrando os processos com maior uso de CPU e memória.
    • top  # 启动top命令,动态显示进程信息
      
      • 1
  • pstree: exibe os processos atualmente em execução e seus relacionamentos pai-filho na forma de um diagrama de árvore.
    • pstree  # 显示进程树
      
      • 1
  • pgrep : Encontre processos que correspondam aos critérios. Você pode pesquisar processos com base no nome do processo, usuário e outras condições.
    • pgrep -u username  # 查找特定用户的所有进程
      
      • 1
  • nice: Altere a prioridade de um processo.nice Quanto menor o valor, maior a prioridade do processo.
    • nice -n 10 long-running-command  # 以较低优先级运行一个长时间运行的命令
      
      • 1
  • jobs: exibe uma lista de trabalhos na sessão de terminal atual, incluindo processos em execução em segundo plano.
    • jobs  # 列出当前会话的后台作业
      
      • 1
  • bg efgbg Coloque o processo suspenso para ser executado em segundo plano,fg Traga o processo em segundo plano de volta para o primeiro plano.
    • bg  # 将最近一个挂起的作业放到后台运行
      fg  # 将后台作业调到前台运行
      
      • 1
      • 2
  • kill: envia um sinal para o processo especificado, geralmente usado para encerrar o processo.
    • kill PID  # 杀死指定的进程ID
      
      • 1
    • Perceber,kill O comando é enviado por padrãoSIGTERM Sinal, que pode ser usado se o processo não estiver respondendo-9usarSIGKILL O sinal mata o processo à força:

    • kill -9 PID  # 强制杀死进程    
      
      • 1

SIGTERM O sinal (Signal Termination) é um sinal padrão usado em sistemas operacionais Unix e semelhantes ao Unix para solicitar o encerramento do processo. Esse sinal geralmente é enviado quando o sistema ou usuário deseja encerrar um processo normalmente.eSIGKILLOs sinais são diferentes,SIGTERM Os sinais podem ser capturados e manipulados por um processo, permitindo que o processo seja limpo antes de sair. (da internet)

A seguir nvidia-smi Alguns usos básicos de comandos:

  • Exibir informações resumidas sobre o status da GPU:
    • nvidia-smi
      
      • 1
  • Exibir informações detalhadas de status da GPU:
    • nvidia-smi -l 1
      
      • 1
    • Este comando atualizará as informações de status a cada 1 segundo.

  • Exibir histórico de uso da GPU:
    • nvidia-smi -h
      
      • 1
  • Liste todas as GPUs e exiba seus PIDs e nomes de processos:
    • nvidia-smi pmon
      
      • 1
  • Encerre à força o processo de GPU especificado:
    • nvidia-smi --id=0 --ex_pid=12345
      
      • 1
    • Isso encerrará à força o processo com PID 12345 no GPU ID 0.

  • Defina o modo de desempenho da GPU:
    • nvidia-smi -pm 1
      nvidia-smi -i 0 -pm 1
      
      • 1
      • 2
    • O primeiro comando definirá todas as GPUs para o modo de desempenho, o segundo comando terá como alvo apenas a GPU com ID 0.

  • Reinicie a GPU:
    • nvidia-smi --id=0 -r
      
      • 1
    • Isso reiniciará a GPU com ID 0.

  • Mostrar informações de ajuda:
    • nvidia-smi -h
      
      • 1

A seguir está uma introdução às informações da GPU por meio de uma imagem:

Insira a descrição da imagem aqui

3.3 Uso de ferramentas

Aqui está uma ferramentaTMUXTMUX é um multiplexador de terminal. Torna mais fácil alternar entre vários terminais, desconectá-los (isso não mata os terminais, eles continuam funcionando em segundo plano) e reconectá-los a outros terminais. Por que introduzir esta ferramenta?Porque isso será feito mais tardeXtunerAo ajustar o modelo, levará muito tempo para usá-lo.TmuxPode resolver a situação em que o programa é encerrado e interrompido. Veja como instalá-lo e usá-lo.

Como a máquina de desenvolvimento usa o sistema operacional Ubuntu, você pode usarlsb_release -a Comando para visualizar informações do sistema Ubuntu:

Insira a descrição da imagem aqui

e então useapt install tmuxComando para instalar o tmux Você pode usá-lo após a conclusão da instalação.tmuxVocê pode usar o tmux com o comando. Se quiser sair do tmux, você pode usar ".Ctrl+d"tecla de atalho.

Na máquina de desenvolvimento, apenas os arquivos no caminho /root são armazenados de forma persistente. O software instalado em outros caminhos será redefinido após a reinicialização.

Métodos de uso específicos podem ser visualizados em:

https://www.ruanyifeng.com/blog/2019/10/tmux.html

4. Introdução ao Conda e Shell (adicional)

Conda é um sistema de gerenciamento de pacotes e ambiente de código aberto que roda em Windows, macOS e Linux. Ele instala, executa e atualiza rapidamente pacotes de software e suas dependências. Usando o Conda você pode facilmente criar, salvar, carregar e alternar diferentes ambientes em sua máquina local.

Já instalado na máquina de desenvolvimentoconda, podemos usá-lo diretamente, e também há um integrado na máquina de desenvolvimentocondaOrdemstudio-conda, apresentaremos abaixocondaUso básico estudio-condaComo usar e apresentarstudio-condaComo isso é alcançado.

Iremos apresentá-lo nas seguintes partes:

  1. configurações de conda
  2. gerenciamento de ambiente conda
  3. conda e pip
  4. Studio-conda é usado com Shell (extensão)

4.1 configurações de conda

podemos usarconda --versionpara visualizar a máquina de desenvolvimento atualcondaversão informação:

Insira a descrição da imagem aqui

quando queremos usarcondaSerá muito lento ao instalar o pacote. Podemos configurar o espelhamento doméstico para melhorar a velocidade de instalação.

#设置清华镜像
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Mas geralmente usamospipInstalando o pacote, iremos apresentá-lo mais tardepipecondadiferença.

Se quisermos visualizar as informações de configuração do conda, podemos usarconda config --showcomando, se for a configuração padrão da máquina de desenvolvimento, ele retornará: (parte da informação)

Insira a descrição da imagem aqui

Essas configurações estão emCondaA configuração do ambiente afetará os métodos e resultados da instalação de pacotes de software, atualizações, gerenciamento de ambiente e outras operações.

4.2 gerenciamento de ambiente conda

Esta parte éconda中非常重要的一部分,掌握了这一部分大家就可以将开发环境玩转到飞起了😀。

4.2.1 Crie um ambiente virtual

podemos usarconda create -n name python``=3.10 Crie um ambiente virtual, o que significa que um ambiente virtual com Python versão 3.10 e nome será criado.Após a criação, você pode.condasob o diretórioenvsEncontrado no diretório.

Insira a descrição da imagem aqui

Quando a versão do python não for especificada, um ambiente virtual baseado na versão mais recente do python será criado automaticamente. Ao mesmo tempo, podemos instalar os pacotes necessários durante a criação do ambiente virtual:conda create -n name numpy matplotlib python=3.10(Mas eu não recomendo que você use desta forma)

Os parâmetros comuns para a criação de um ambiente virtual são os seguintes:

  • -n ou --name: Especifique o nome do ambiente a ser criado.
  • -c ou --channel: Especifique canais de pacotes adicionais.
  • –clone: ​​Clone um ambiente existente para criar um novo ambiente.
  • -p ou --prefix: Especifique o caminho de instalação do ambiente (local não padrão).
4.2.2 Verifique quais ambientes virtuais existem

Se quisermos ver quais ambientes virtuais temos, podemos usar o seguinte comando:

conda env list
conda info -e
conda info --envs
  • 1
  • 2
  • 3

Insira a descrição da imagem aqui

Ao mesmo tempo, também podemos ver o diretório onde o ambiente está localizado.

4.2.3 Ativando e saindo do ambiente virtual

Depois de criarmos o ambiente virtual podemos usarconda activate name comando para ativar o ambiente virtual, como verificar se a troca foi bem-sucedida?É fácil, basta olhar(base)Se se torna o nome do ambiente virtual criado.

Insira a descrição da imagem aqui

Se quiser sair do ambiente virtual, você pode usar:

conda activate
conda deactivate
  • 1
  • 2

Ambos os comandos retornarãobaseambiente porquebaseÉ o ambiente básico do conda. Se você observar com atenção,baseO diretório de ambiente é de nível superior a outros diretórios de ambiente virtual.

4.2.4 Excluir e exportar ambiente virtual

Se quiser excluir um ambiente virtual, você pode usarconda remove --name name --all, se você excluir apenas um ou alguns pacotes no ambiente virtual, poderá usarconda remove --name name package_name

A exportação de um ambiente virtual é muito necessária para um ambiente específico, porque as dependências de alguns pacotes de software são muito complexas e será difícil recriá-lo e configurá-lo você mesmo. Se exportarmos o ambiente configurado, poderemos restaurá-lo na próxima vez. e você também pode compartilhar a configuração com outras pessoas.

#获得环境中的所有配置
conda env export --name myenv > myenv.yml
#重新还原环境
conda env create -f  myenv.yml
  • 1
  • 2
  • 3
  • 4

Por exemplo vamosxtuner0.1.17O ambiente virtual é exportado e as informações de configuração são as seguintes:

Insira a descrição da imagem aqui

Esses incluemnome do ambienteA localização do repositório online para pacotes de ambiente virtualeDependências do ambiente virtual . Posteriormente usaremos métodos de uso avançados para restaurar rapidamente o ambiente virtual.

4.3 conda e pip

Nesta parte apresentamos algunscondaepipAlgumas diferenças:

  1. conda pode gerenciar pacotes não-python e pip só pode gerenciar pacotes python.
  2. conda pode ser usado para criar um ambiente virtual, mas o pip não pode e precisa contar com pacotes como o virtualenv.
  3. O pacote instalado pelo conda é compiladoarquivo binário, os pacotes dependentes serão instalados automaticamente durante a instalação dos arquivos do pacote;roda ou código fonte, outras dependências além da linguagem python não serão suportadas durante o processo de instalação.
  4. Os pacotes instalados pelo conda serão baixados no diretório correspondente ao ambiente virtual atual e podem ser baixados uma vez e instalados várias vezes. pip é baixado diretamente para o ambiente correspondente.

Roda É um formato de pacote de instalação do Python.

É um formato de distribuição binária pré-compilado, semelhante aos binários compilados em conda.

As principais vantagens do formato Roda incluem:

  1. Instalação rápida: Por ser pré-compilado, não há necessidade de passar pelo processo de compilação como instalação do código-fonte durante a instalação, economizando tempo.
  2. Consistência: Garante que os resultados da instalação sejam consistentes em diferentes sistemas e ambientes.

Por exemplo, se você deseja instalar uma grande biblioteca Python, usar o formato Wheel pode evitar problemas de instalação causados ​​por diferenças nos ambientes de compilação em máquinas diferentes. Além disso, para aqueles sistemas que não possuem um ambiente de compilação ou possuem recursos de compilação fracos, o formato Wheel pode tornar o processo de instalação mais suave.

4.4 Uso do Studio-conda e Shell (extensão)

Essa parte é uma parte estendida, porque acho essa parte muito interessante e muito prática, então se você tiver interesse pode aprender.

Vamos primeiro apresentarstudio-conda , que é um comando integrado da máquina de desenvolvimento e é implementado por meio de um script Shell. O que é um script Shell?

Script de shell Um arquivo de texto contendo uma série de comandos organizados em uma ordem específica para automatizar tarefas em um ambiente Unix/Linux ou sistema operacional semelhante.

Os scripts Shell são geralmente escritos na linguagem Shell. Linguagens Shell comuns, como Bash, Sh, etc. são os comandos básicos do Linux que apresentamos anteriormente, que pertencem à linguagem Shell.

Possui os seguintes recursos importantes:

  1. automação : uma série de operações complexas e repetitivas pode ser escrita como um script e, em seguida, simplesmente executar o script para automatizar essas operações, economizando tempo e reduzindo erros. Por exemplo, um script que faz backup regular de arquivos importantes todos os dias.
  2. Administração de sistema : Usado para gerenciar configuração do sistema, permissões de usuário, controle de processos, etc. Por exemplo, um script que cria um novo usuário e define suas permissões.
  3. Processamento em lote : Capacidade de processar vários arquivos ou dados simultaneamente. Por exemplo, um script que converte um lote de arquivos de imagem de um formato para outro.
  4. controle do processo: Como julgamento condicional (if-else), loop (for, while), etc., permitindo que scripts realizem diferentes operações de acordo com diferentes situações.

Questudio-condaFaz parte da automação. O arquivo de configuração do ambiente bash do usuário root em nossa máquina de desenvolvimento é..bashrc, mas na verdade o arquivo de configuração principal é/share/.aide/config/bashrc, existem alguns comandos escritos neste arquivo que nos permitem realizar algumas operações de forma mais rápida, como:

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"
  • 1
  • 2
  • 3
  • 4
  • 5

exporté usado para definir variáveis ​​de ambiente.aliasé copiar um arquivo sh em uma variável. Isso pode ser executado no terminal como um comando.studio-condaÉ isso.

aquistudio-smiÉ usado para verificar o uso da memória virtual quando abrimos./share/studio-smiO arquivo pode ser visto:

#!/bin/bash

if command -v vgpu-smi &> /dev/null
then
    echo "Running studio-smi by vgpu-smi"
    vgpu-smi
else
    echo "Running studio-smi by nvidia-smi"
    nvidia-smi
fi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Este script é usado para verificar se existe um vgpu-smi comando, se presente, ele será executadovgpu-smi para exibir informações de status de uma GPU virtual (vGPU, se não estiver presente, ela será executada);nvidia-smi para exibir informações de status da GPU NVIDIA. Como mostrado abaixo:

Insira a descrição da imagem aqui

nvidia-smi é uma ferramenta para monitorar e gerenciar dispositivos físicos de GPU NVIDIA, evgpu-smi Projetado para monitorar e gerenciar recursos de GPU virtualizados por meio da tecnologia NVIDIA vGPU.

nós vemos/share/install_conda_env.shO conteúdo do arquivo é o seguinte:

#!/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 extend

XTUNER_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=/share

list() {
    cat <<-EOF
  预设环境          描述

  internlm-base    pytorch:2.0.1, pytorch-cuda:11.7
  xtuner           Xtuner(源码安装: main $(echo -e "033[4mhttps://github.com/InternLM/xtuner/tree/main033[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=$1
    target=$2

    if [[ -z "$source" || -z "$target" ]]; then
        echo -e "033[31m 输入不符合规范 033[0m"
        help
        exit 1
    fi

    if [ ! -d "${SHARE_CONDA_HOME}/$source" ]; then
        echo -e "033[34m 指定的预设环境: $source不存在033[0m"
        list
        exit 1
    fi

    if [ -d "${CONDA_HOME}/envs/$target" ]; then
        echo -e "033[34m 指定conda环境的目录: ${CONDA_HOME}/envs/$target已存在, 将清空原目录安装 033[0m"
        wait_echo&
        wait_pid=$!
        rm -rf "${CONDA_HOME}/envs/$target"
        kill $wait_pid
    fi

    echo -e "033[34m [1/2] 开始安装conda环境: <$target>. 033[0m"
    sleep 3
    tar --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 ]; then
        echo -e "033[31m 初始化conda环境: ${target}失败 033[0m"
        exit 10
    fi

    kill $wait_pid

    # for xtuner, re-install dependencies
    case "$source" in
    xtuner)
        source_install_xtuner $target
        ;;
    esac

    echo -e "033[34m [2/2] 同步当前conda环境至jupyterlab kernel 033[0m"
    lab add $target
    source $CONDA_HOME/bin/activate $target
    cd $HOME_DIR

    echo -e "033[32m conda环境: $target安装成功! 033[0m"

    echo """
    ============================================
                    ALL DONE!
    ============================================
    """
}

······
dispatch $@
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97

um deles*list*()Espere, é tudostudio-condafunção, que pode implementar certas operações, por exemplo, podemos usarstudio-conda env listPara visualizar o ambiente padrão:

Insira a descrição da imagem aqui

em*clone*()A principal função da função é copiar o ambiente, mas ela só pode ser copiada do ambiente padrão. O código principal é na verdade:

tar --skip-old-files -xzvf /share/pkgs.tar.gz -C ${CONDA_HOME}

conda create -n $target --clone ${SHARE_CONDA_HOME}/${source}
  • 1
  • 2
  • 3

Descompacte o pacote compactado do ambiente predefinido e, em seguida, crie um ambiente virtual por meio do clone. No entanto, alguma lógica também é definida no script Shell, mas é apenas um julgamento. Se você estiver familiarizado com qualquer linguagem de programação, deverá ser capaz. para entendê-lo. Se você não consegue entendê-lo, também não é um grande problema.

Então, como adicionamos nosso próprio ambiente criado aostudio-condaE quanto ao meio?

A primeira etapa é criar um novo ambiente conda em /share/conda_envs

conda criar -p /share/conda_envs/xxx python=3.1x

A segunda etapa é copiar os arquivos em /root/.conda/pkgs na máquina local para /share/pkgs, recompactá-los e substituí-los (esta etapa é armazenar os grandes pacotes públicos durante o processo de criação do conda para evitar downloads repetidos)

cp -r -n /root/.conda/pkgs/* /share/pkgs/

cd /share && tar -zcvf pacotes.tar.gz pacotes

A terceira etapa é atualizar a função de lista em install_conda_env.sh e adicionar uma nova descrição do ambiente conda.

O método acima é o método fornecido pela máquina de desenvolvimento por padrão. Na verdade, existe outro método que usamos anteriormente.condaExportadoxtuner0.1.17Arquivos de configuração para ambientes virtuais, podemos usarconda env create -f xtuner0.1.17.yml comando para restaurar o ambiente virtual.Vamos escrever um script Shell simples para implementar esta operação: Criamostest.sharquivo, escreva o seguinte conteúdo:

#!/bin/bash

# 定义导出环境的函数
export_env() {
    local env_name=$1
    echo "正在导出环境: $env_name"
    # 导出环境到当前目录下的env_name.yml文件
    conda env export -n "$env_name" > "$env_name.yml"
    echo "环境导出完成。"
}

# 定义还原环境的函数
restore_env() {
    local env_name=$1
    echo "正在还原环境: $env_name"
    # 从当前目录下的env_name.yml文件还原环境
    conda env create -n "$env_name" -f "$env_name.yml"
    echo "环境还原完成。"
}

# 检查是否有足够的参数
if [ $# -ne 2 ]; then
    echo "使用方法: $0 <操作> <环境名>"
    echo "操作可以是 'export' 或 'restore'"
    exit 1
fi

# 根据参数执行操作
case "$1" in
    export)
        export_env "$2"
        ;;
    restore)
        restore_env "$2"
        ;;
    *)
        echo "未知操作: $1"
        exit 1
        ;;
esac
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

Depois de concluirmos a criação do script Shell, precisamos conceder permissões ao script. Você pode usar o comando:chmod +x test.sh e digite./test.sh restore xtuner0.1.17E pressione Enter para restaurar o ambiente virtual.

Insira a descrição da imagem aqui

No entanto, isso não é muito diferente do uso direto. Se esta operação for comparada com a operação na máquina de desenvolvimento,studio-conda Combinar comandos será muito conveniente, mas os métodos de cópia do ambiente são diferentes.Portanto, se você quiser implementá-lo, você precisa/share/install_conda_env.shA lógica do arquivo é modificada.

Ok, esse é todo o conteúdo deste nível. Espero que o conteúdo acima seja útil para todos no futuro. Se você quiser aprender mais sobre Linux, pode ler o artigo do meu blog. , será útil aprendermos que modelos grandes não têm muito impacto, mas se você aprender bem o Linux, seu aprendizado de modelos grandes será muito tranquilo. Finalmente, não se esqueça de completar os níveis que definimos anteriormente!

Link do blog:Linux-Linux

problema comum

1. O ambiente da máquina de desenvolvimento do InternStudio está quebrado. Como inicializar o ambiente da máquina de desenvolvimento?

Execute com cuidado! ! ! !Todos os dados serão perdidos. Isto está disponível apenas na plataforma InternStudio. Não faça isso em sua própria máquina.

  • O primeiro passo é conectar o terminal local à máquina de desenvolvimento via ssh (deve estar conectado via ssh para operar, não na web!!!)
  • Execução do segundo passo rm -rf /root, levará cerca de 10 minutos para esperar
  • A terceira etapa é reiniciar a máquina de desenvolvimento. O sistema redefinirá o arquivo de configuração no caminho /root.
  • o quarto passo ln -s /share /root/share

Missão de nível

Para passar na missão de nível, você precisa fazer capturas de tela nas principais etapas:

detalhes da missãoTempo necessário para concluir
MissãoConclua a conexão SSH e o mapeamento de portas e executehello_world.py10 minutos
Tarefa opcional 1Conclua os comandos básicos do Linux na máquina de desenvolvimento10 minutos
Tarefa opcional 2Use VSCODE para conectar-se remotamente à máquina de desenvolvimento e criar um ambiente conda10 minutos
Tarefa opcional 3Criar e executartest.shdocumento10 minutos