Como reservar nós completos no Sun Grid Engine?

6

Como você usa o SGE para reservar nós completos em um cluster?

Eu não quero dois processadores de uma máquina, três processadores de outra e assim por diante. Eu tenho um cluster quadcore e quero reservar 4 máquinas completas, cada uma com 4 slots. Não posso simplesmente especificar que eu quero 16 slots porque não garante que eu tenha 4 slots em 4 máquinas cada.

Alterar a regra de alocação para FILL_UP não é suficiente porque, se não houver máquinas completamente inativas, o SGE simplesmente "enche" as máquinas menos carregadas o máximo possível, em vez de esperar por 4 máquinas ociosas e então agendando a tarefa.

Existe alguma maneira de fazer isso? Existe um lugar melhor para fazer essa pergunta?

    
por artif 06.05.2011 / 00:10

7 respostas

2

SGE é estranho com isso, e eu não encontrei uma boa maneira de fazer isso no caso geral. Uma coisa que você pode fazer, se você sabe o tamanho da memória do nó que você quer, é qsub enquanto reserva uma quantidade de memória quase igual à capacidade total do nó. Isso garantirá que ele capture um sistema sem que nada mais seja executado.

    
por 06.05.2011 / 05:46
5

Acho que encontrei um jeito, mas provavelmente não funciona em antigos SGEs como o meu. Parece que a nova versão do SGE tem programação exclusiva incorporada.

link

Outra possibilidade que considerei, mas bastante propensa a erros, é usar qlogin em vez de qsub e reservar manualmente 4 slots em cada máquina quadcore desejada. Compreensivelmente, automatizar isso não é particularmente fácil ou divertido.

Por último, talvez seja uma situação em que grupos de host podem ser usados. Assim, por exemplo, criando um host com 4 máquinas quadcore e, em seguida, copiando para esse subconjunto específico de uma fila, solicitando um número de processadores igual ao número total máximo no grupo. Infelizmente, isso é algo como hardcoding e tem muitas desvantagens, por exemplo, ter que esperar que as pessoas desocupem um determinado grupo de host codificado e que precisam de mudanças se você quiser mudar para 8 em vez de 4 máquinas, etc.

    
por 06.05.2011 / 10:41
2

Parece que há esta solicitação de linha de comando oculta para adicionar:

-l excl=true

Mas você precisa configurá-lo em seu SGE ou OpenGridScheduler adicionando-o à lista de valores complexos (qconf -mc) e ativando cada host individual (qconf -me hostname)

veja este link para detalhes: link

Em resumo:

tipo:

qconf -mc

e adicione a linha:

exclusive    excl      BOOL      EXCL   YES          YES          0        1000

então:

qconf -me <host_name>

e edite a linha complex_values para ler:

complex_values        exclusive=true

Se você já tem algum complex_value específico do host, apenas a vírgula os separa.

    
por 01.02.2013 / 22:25
1

Estou tentando fazer quase exatamente a mesma coisa e estou procurando ideias. Eu acho que um pe_hostsfile é a melhor opção, mas eu não sou um gerente do nosso sistema SGE, e não há arquivos hosts configurados, então eu preciso de um trabalho rápido. Acabou de sair do link de agendamento exclusivo de configuração e ver que isso também requer direitos de gestão ...

Eu acho que um script wrapper poderia fazer isso. Escrevi um verso de uma linha para descobrir o número de núcleos disponíveis deixados em uma máquina (abaixo). Nossa grade é heterogênea, com um nó tendo 24 núcleos, uns 8 e a maioria apenas 4, o que torna as coisas um pouco estranhas.

Aqui está o bash one-liner de qualquer maneira.

n_processors='qhost | awk 'BEGIN{name="'\'hostname\''"} ; {if($1==name){print int($3)-int($4+0.99)}}''

O problema agora é como obter essa variável do bash em uma diretiva de pré-processamento de scripts de inicialização do SGE? Talvez eu apenas forneça o argumento abaixo no meu shell script, já que o ambiente pvm é fornecido com o SGE. Não significa que está configurado embora ...

#$ -pe pvm 24-4

A página da Sun sobre Gerenciamento de Ambientes Paralelos é muito útil, embora, novamente, as instruções sejam principalmente voltado para administradores.

    
por 08.06.2011 / 04:27
1

Nós definimos a regra de alocação para o número de slots disponíveis no nó (neste caso, 4). Isso significa que você só pode iniciar trabalhos com n * 4 CPUs, mas alcançará o resultado desejado: 16 CPUs serão alocadas como 4 nós com 4 CPUs cada.

    
por 22.06.2011 / 15:35
1

Especifique a regra de alocação na configuração PE como $ pe_slots

Isso fará com que todos os slots sejam alocados em um único host

    
por 19.07.2012 / 09:33
0

Eu finalmente encontrei a resposta para isso. No começo eu usei o acima -l excl=True setup conforme descrito acima. No entanto, isso não resolve o problema.

Para resolver completamente o problema que precisei configurar e pe_environment adicional. No meu cluster, temos um número de 12 nós principais. Então, vou usar isso como meu exemplo.

Eu criei um ambiente adicional chamado mpich2_12. Colado abaixo ..

pe_name            mpich_12
slots              999
user_lists         sge_user
xuser_lists        NONE
start_proc_args    /opt/gridengine/mpi/startmpi.sh -catch_rsh $pe_hostfile
stop_proc_args     /opt/gridengine/mpi/stopmpi.sh
allocation_rule    12
control_slaves     TRUE
job_is_first_task  FALSE
urgency_slots      min
accounting_summary TRUE

Observe que a regra de atribuição está definida como 12, isso significa que o trabalho DEVE usar 12 núcleos em um nó. Se você enviar um trabalho solicitando 48 CPUs, ele aguardará e pegará 4 nós COMPLETOS quando eles estiverem disponíveis.

Eu ainda uso a opção -l excl=True , mas suspeito que isso seja irrelevante agora.

Se eu tiver trabalhos que exijam apenas uma CPU (e eu faço), eu os envio para a mesma fila, mas sem a opção -l exel=True , e eu uso minha% originalpe_environment que tem o allocation_rule = 'fillup' Qualquer trabalho submetido com o ambiente mpich_12 irá esperar até que haja nós completos livres. Meu cluster funciona muito melhor agora.

    
por 18.06.2015 / 15:11