3

これは長い質問なので、最初に要約します。

私は並列プログラミングとグリッド システムの初心者です。アカウントを持っているグリッドでhttp://jeremybejarano.zzl.org/MPIwithPython/introMPI.htmlの最初の例を実行したいと思います。メンテナによって提供された C の例があります。私はそれを実行できます。しかし、Python バージョンでは、ランクがすべてゼロになります。何が問題なのですか?

質問の長いバージョン:

このコードは、実行に時間がかかる python 2.7 (+numpy+matplotlib+mayavi) で記述されています。私はいくつかのグリッドにアカウントを持っているので、そこにコードを移動し、試行が完了するのを待つ時間を減らしたいと考えています。

残念ながら、私は並列処理やグリッドなどに不慣れです。また、グリッドの管理者権限もありません。

一部のドキュメントが提供されています。システムは SLURM を使用します。スバッチファイルを用意し、 でジョブを送信しますsbatch filename。C で書かれたこの helloworld プログラムの例があります。

#include <stdio.h>
#include <mpi.h>


int main (argc, argv)
     int argc;
     char *argv[];
{
  int rank, size;

  MPI_Init (&argc, &argv);      /* starts MPI */
  MPI_Comm_rank (MPI_COMM_WORLD, &rank);        /* get current process id */
  MPI_Comm_size (MPI_COMM_WORLD, &size);        /* get number of processes */
  printf( "Hello world from process %d of %d\n", rank, size );
  MPI_Finalize();
  return 0;
}

そして、管理者が提供するそれを実行するための slurm ファイル:

#!/bin/bash
#SBATCH -M linux
#SBATCH -p mid1
#SBATCH -A username
#SBATCH -J mid1-test
#SBATCH -N 1 
#SBATCH -n 4 
#SBATCH --time=2-00:00:00 
#SBATCH --workdir=/truba_scratch/username/test
#SBATCH --output=slurm-%j.out
#SBATCH --error=slurm-%j.err
#SBATCH --mail-type=ALL
#SBATCH --mail-user=who@am.i


. /usr/share/Modules/init/sh
module load somehostithink/library/openmpi-1.4.3/gcc
export OMP_NUM_THREADS=1
echo "SLURM_NODELIST $SLURM_NODELIST"

mpirun helloworld

exit

までに提出できますsbatch helloworld.slurm。最後に、0 から 3 までの「hello worlds」が表示されます。たとえば、ランクはプロセスごとに異なる値を取ります。良い!

問題は、Python で書かれたサンプル プログラムがないことです。システムの python は古いです: 2.6.x。そこで、anaconda ディストリビューションをダウンロードして、ユーザー空間にインストールしました。上記の helloworld.slurm の例を適応させようとしました。ここで helloworld の例を実行したいと思います: http://jeremybejarano.zzl.org/MPIwithPython/introMPI.html。ジョブを送信できますが、出力ファイルからわかるように、すべて同じランクの helloworld を取得します。たとえば、これは異なるプロセスでは実行されないようです。

注: C バージョンでも同じエラーが発生しますが、それでも実行され、異なるランクが生成されます。

ハローワールド python バージョン:

from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
print "hello world from process ", rank

Python Hello World の slurm ファイル (main.py)

#!/bin/bash
#SBATCH -M linux
#SBATCH -p mid1
#SBATCH -A username
#SBATCH -J mid1-test
#SBATCH -N 1
#SBATCH -n 4
#SBATCH --time=2-00:00:00
#SBATCH --workdir=/scratch/username/test
#SBATCH --output=slurm-%j.out
#SBATCH --error=slurm-%j.err
#SBATCH --mail-type=ALL
#SBATCH --mail-user=who@am.i

. /usr/share/Modules/init/sh
module load somehost/library/openmpi-1.4.3/gcc
export OMP_NUM_THREADS=1
echo "SLURM_NODELIST $SLURM_NODELIST"

mpirun /scratch/username/anaconda/bin/python /scratch/username/test/main.py

exit

生成されたエラー ファイル:

slurmd[shomehostithink]: task/cgroup: plugin not compiled with hwloc support, skipping affinity.

出力ファイルは次のように生成されます。

SLURM_NODELIST hostidithink
hello world from process  0
hello world from process  0
hello world from process  0
hello world from process  0

それで、問題の原因は何でしょうか?どうすれば解決できますか?

私は明らかに管理者にメッセージを送信しましたが、彼はまだ応答していません。

4

1 に答える 1

1

Linux では、Anacondaはmpichmpi4pyにバンドルされています(OS X では OpenMPI を使用します)。 OpenMPI を使用しているため、シングルトン効果はそれによって説明できます。次の 2 つのオプションがあります。mpirun

  1. ソースから Anaconda を再コンパイルして openmpi-1.4.3/gcc を使用する
  2. Anacondaのmpirunプログラムを見つけて、それを次のようなもので使用してください/scratch/username/anaconda/bin/mpirun /scratch/username/anaconda/bin/python /scratch/username/test/main.py

Slurm で発生するエラーは、cgroup Slurm プラグインが hwloc サポート付きでコンパイルされていないことを示しているため、タスク アフィニティ (プロセスをコアに固定する) はサポートされていません。これがシングルトンの問題の原因であってはなりません。

于 2014-11-19T16:14:36.383 に答える