Trabalhando com Clusters HPC

11

Na minha universidade, temos um cluster de computação HPC. Eu uso o cluster para treinar classificadores e assim por diante. Portanto, geralmente, para enviar um trabalho para o cluster (por exemplo, script python scikit-learn), preciso escrever um script Bash que contenha (entre outros) um comando como qsub script.py.

No entanto, acho esse processo muito, muito frustrante. Normalmente, o que acontece é que eu escrevo o script python no meu laptop e, em seguida, faço login no servidor e atualizo o repositório SVN, para obter o mesmo script python lá. Depois, escrevo o script Bash ou o edito para que eu possa executar o script bash.

Como você vê, isso é realmente frustrante, pois, para cada pequena atualização do script python, preciso executar várias etapas para executá-lo no cluster de computação. É claro que a tarefa fica ainda mais complicada quando tenho que colocar os dados no servidor e usar o caminho dos conjuntos de dados no servidor.

Tenho certeza de que muitas pessoas aqui estão usando clusters de computação para suas tarefas de ciência de dados. Eu só quero saber como vocês conseguem enviar os trabalhos para os clusters?

Jack Twain
fonte
11
Ah, as alegrias de implantação ... aprimorados pelas alegrias de sistemas distribuídos :)
logC

Respostas:

5

Peça ao administrador da rede que adicione sua máquina local como um "host de envio" e instale o SGE (que assumimos que você esteja usando, na verdade, você não diz) para que você possa usar qsubsua máquina.

OU....

Use o emacs, então você poderá editar no seu HPC através dos recursos de conexão ssh "tramp" do emacs e manter um shell aberto em outra janela do emacs. Você não diz qual editor / sistema operacional você gosta de usar. Você pode até configurar o emacs para salvar um arquivo em dois locais, para poder salvar em sua máquina local para executar testes e no sistema de arquivos HPC simultaneamente para grandes trabalhos.

Spacedman
fonte
4

Existem muitas soluções para aliviar o ônus de copiar o arquivo de uma máquina local para os nós de computação nos clusters. Uma abordagem simples é usar uma interface que permita o acesso múltiplo às máquinas no cluster, como clusterssh (cssh). Ele permite que você digite comandos para várias máquinas ao mesmo tempo através de um conjunto de telas de terminal (cada uma com uma conexão ssh com uma máquina diferente no cluster).

Como seu cluster parece ter sido qsubconfigurado, seu problema pode estar relacionado à replicação dos dados nas máquinas (além de simplesmente executar um comando em cada nó). Portanto, para abordar esse ponto, você pode escrever um scpscript, copiar coisas de e para cada nó no cluster (que certamente é melhor endereçado com o SVN) ou pode configurar um NFS. Isso permitiria um acesso simples e transparente aos dados e também reduziria a necessidade de replicar dados desnecessários.

Por exemplo, você pode acessar um nó, copiar os dados para esse local e simplesmente usá-los remotamente , via comunicação em rede. Não estou familiarizado com a configuração de um NFS, mas você já tem acesso a ele (caso sua pasta pessoal seja a mesma nas máquinas que você acessa). Em seguida, os scripts e dados poderiam ser enviados para um único local e posteriormente acessados ​​de outros. Isso é semelhante à abordagem SVN, exceto que é mais transparente / direta.

Rubens
fonte
4

Sua abordagem do uso de um repositório de versão de origem é boa e, na verdade, permite que você também trabalhe no cluster e copie tudo de volta.

Se você se encontra fazendo pequenas edições em seu script Python no seu laptop, atualizando o diretório SVN no cluster, por que não trabalhar diretamente no front-end do cluster, faça todas as pequenas edições necessárias e, no final do dia, confirme tudo lá e atualizar no seu laptop?

Tudo o que você precisa é se familiarizar com o ambiente (SO, editor, etc.) ou instalar seu próprio ambiente (geralmente instalo no meu diretório pessoal a versão mais recente do Vim , Tmux , etc. com os arquivos de ponto apropriados, para que eu me sinta em casa. casa lá.)

Além disso, você pode versionar seus dados e até seus resultados intermediários, se o tamanho permitir. Meus repositórios geralmente incluem código, dados (versões originais e limpas), documentação e fontes de papel para publicação (látex)

Por fim, você pode criar um script para o envio do seu trabalho para evitar a modificação manual de scripts. qsubaceita um script do stdin e também aceita todos os #$comentários como argumentos da linha de comando.

damienfrancois
fonte
3

Pela redação da sua pergunta, presumo que você tenha uma máquina local e uma máquina remota onde atualiza dois arquivos - um script Python e um script Bash. Ambos os arquivos estão sob controle SVN e ambas as máquinas têm acesso ao mesmo servidor SVN.

Lamento não ter nenhum conselho específico para o seu sistema de grade, mas deixe-me listar alguns pontos gerais que considero importantes para qualquer implantação.

Mantenha as alterações de produção limitadas às alterações na configuração . Você escreve que precisa "usar o caminho dos conjuntos de dados no servidor"; isso me parece que você tem os caminhos codificados no seu script Python. Essa não é uma boa ideia, precisamente porque você precisará alterar esses caminhos em todas as outras máquinas para as quais move o script. Se você confirmar essas alterações no SVN, na máquina local, você terá os caminhos remotos e assim por diante ... (E se houver não apenas caminhos, mas também senhas? Você não deve ter senhas de produção em um SVN servidor.)

Portanto, mantenha os caminhos e outras informações de configuração em um .iniarquivo e use o ConfigParser para lê-lo ou use um .jsonarquivo e use o módulo json . Mantenha uma cópia do arquivo localmente e uma remotamente, ambas no mesmo caminho, ambas sem controle SVN, e apenas mantenha o caminho para esse arquivo de configuração no script Python (ou obtenha-o na linha de comando, se você não puder manter os dois configurações no mesmo caminho).

Mantenha a configuração o menor possível . Qualquer configuração é uma "parte móvel" do seu aplicativo e qualquer sistema é mais robusto quanto menos partes móveis. Um bom indicador de algo que pertence à configuração é exatamente o de que você precisa editá-lo sempre que mover o código; coisas que não precisaram de edição podem permanecer como constantes no código.

Automatize sua implantação . Você pode fazer isso através de um script Bash na sua máquina local; observe que você pode executar qualquer comando em uma máquina remota através de ssh. Por exemplo:

svn export yourprojectpath /tmp/exportedproject
tar czf /tmp/yourproject.tgz /tmp/exportedproject
scp /tmp/myproject.tgz youruser@remotemachine:~/dev

## Remote commands are in the right hand side, between ''
ssh youruser@remotemachine 'tar xzf ~/dev/yourproject.tgz'
ssh youruser@remotemachine 'qsub ~/dev/yourproject/script.py'

Para que isso funcione, é claro que você precisa ter um login sem senha , com base em chaves públicas / privadas, configurado entre a máquina local e a remota.

Se você precisar de mais do que isso, pense em usar o Python's Fabric ou a culinária de nível superior .

logc
fonte