Pythonコードを実行するために特異点コンテナを構築してきましたが、特異点のドキュメントを読んでも、エラー/動作を理解できません。
まず、コンテナーは Docker からブートストラップされた Ubuntu18.04 です。
Bootstrap: docker
From: ubuntu:18.04
事前にコンパイルする必要があるpythonモジュール(ニューロン)を利用する必要があります。%post
定義ファイルのセクションでコードをコンパイルし、環境変数を追加しました。
echo 'export PATH=$PATH:/usr/local/nrn/x86_64/bin' >>$SINGULARITY_ENVIRONMENT
echo 'export LD_LIBRARY_PATH=/usr/local/nrn/x86_64/lib:$LD_LIBRARY_PATH' >>$SINGULARITY_ENVIRONMENT
あまり問題なくコンテナを構築できます(を使用sudo singularity build --sandbox
)。しかし、すべてが期待どおりに機能することを確認するために、テスト スクリプト (test.py) を実行しようとしています。スクリプトでは、問題のモジュール (ニューロン) をインポートしてから、リストを csv に保存して、データを適切に保存できることを確認します。したがって、次のようになります。
import neuron #this fails and gives an unusual error in specific circumstances I don't understand (described below)
import numpy as np
some_data = [1,2,3]
np.savetxt('test_results.csv',np.asarray(some_data),delimiter=',')
使用時に提供するフラグに応じて、singularity exec
異なる結果が得られますが、それは理解できません (または、どこから理解を開始すればよいかを知っています - これはニューロン、特異点、またはubuntu
問題ですか?)。
完全を期すために、コンテナー (および test.py) は、これらのコマンドを実行しているのと同じディレクトリ内にあります (この例では dir です)。したがって、--no-home
フラグを使用せずに $HOME をマウントし、次のように test.py を実行しようとすると、次のようになります。
singularity exec --writable --bind /home/bidby/path/to/some/dir:/mnt my_container.simg python3 /mnt/test.py
次のようなエラーが表示されますdlopen failed - x86_64/.libs/libnrnmech.so: undefined symbol: celsius
。かなりグーグルで調べてみましたが、c++ リンク エラーである可能性があります (ただし、Python しかよく知らないので、これをデバッグするのは簡単ではありませんでした)。
ただし、--no-home
フラグを使用する場合、つまり:
singularity exec --no-home --writable --bind /home/bidby/path/to/some/dir:/mnt my_container.simg python3 /mnt/test.py
その後、モジュールは正常にインポートされ、新しいエラーが発生します:
Traceback (most recent call last):
File "/mnt/test.py", line 15, in <module>
np.savetxt('test_results.csv',np.asarray(some_data),delimiter=',')
File "/usr/local/lib/python3.6/dist-packages/numpy/lib/npyio.py", line 1352, in savetxt
open(fname, 'wt').close()
PermissionError: [Errno 13] Permission denied: 'test_results.csv'
これを数日間継続的にグーグルで検索していますが、何が問題なのかわかりません。私が学んだこととテストしたことから、環境変数がコンテナに渡される方法と関係があるかもしれないと思いますが、ここに保存する権限がない理由は私にはわかりません. --no-home
しかし、フラグの使用がモジュールのインポートに影響する理由を理解できれば、これは解決されるかもしれないと思います。
これは問題の解決には役立たないかもしれませんが、私が気づいた/試した他のこと:
このフラグを使用する--containall
と、問題なく test.py を実行できますが、保存しようとした csv ファイルが見つかりません。私は言うドキュメントをチェックしました:
--containall (略して -C) フラグを使用すると、$HOME はマウントされず、ダミーのバインド マウントが $HOME ポイントに作成されます。-B` (または --bind) を使用して $HOME ディレクトリをバインドすることはできません。空のマウントが作成されるためです。そのため、イメージ内の /home/user にファイルがある場合、 --containall フラグはそれらをすべて非表示にします。
そして、この「ダミーバインドマウント」はファイルが書き込まれている場所であると推測しているため、実際に見つけることができないのはなぜですか。
フラグを使用してコンテナにシェルを作成するsudo
と、--writable
問題なくニューロンをインポートできます。これらのフラグのいずれも使用しない場合、上記と同じ「未定義シンボル」エラーが発生します。
LD_LIBRARY_PATH をエクスポートしないと、別の .so ファイルを参照する別の dlopen エラーが発生し、ファイルが存在しないというメッセージが表示されます。これは、パスの問題であるという私の考えを再確認します。
このエラーを再現するのに十分なコードが含まれていないことはわかっていますが、このコンテナーを作成する時間/エネルギーを持っている人はいないと思います (かなり大きいため) が、最も関連性の高い部分を含めたと思います。ただし、必要に応じてさらに追加します。
これをデバッグすることは私にとって悪夢でした.誰かが私がグーグルで調べるべき正しい方向に私を向けることができれば、私はそれを大いに感謝します.