Singularity:特異点なのなそうな.
現在 Singularity には Sylabs社から提供される オープンソース版な SingularityCE (Singularity Community Edition ) とその有償版 SingularityPro がある
他に Apptainer https://apptainer.org/がある.
同じ起点からスタートしているが、企業系とそうじゃない系(Linux Foundation)に分かれた感じかな. v3.8から SingularityCEの名称が付与された
仮想コンテナです. dockerのようなもの. でもdockerでは必要であった管理者権限が不要
本家様 https://sylabs.io/singularity/
GitHub https://github.com/sylabs/singularity
Singularity/crYOLO SingularityでcrYOLOを作ってみた
Singularity/Relion Singularityでrelionを作ってみた
Singularity/cryoSPARC SingularityでcryoSPARCを作ってみた(みかんせい)
Singularity/mpi
Singularity/eman
一応 epelリポジトリから入手可能です
[root@centos7 ~]# yum install epel-release
[root@centos7 ~]# yum --enablerepo=epel install apptainer apptainer-suid
(RHEL8系)
[root@RockyLinux ~]# dnf install epel-release
[root@RockyLinux ~]# dnf install apptainer
操作は至って簡単で、「ubuntu20.04」を扱いたければ
[saber@centos7 ~]$ singularity pull docker://ubuntu:20.04
とすればdockerHub様からイメージを取得して、singularity向けのimage「ubuntu_20.04.sif」を作ってくれる
[saber@centos7 ~]$ ls -lh ubuntu_20.04.sif
-rwxr-xr-x 1 saber em 27M 12月 19 11:32 ubuntu_20.04.sif
[saber@centos7 ~]$
このイメージを使うには「singularity shell ubuntu_20.04.sif」とする 拡張子.sifは「singulairty image file」
[saber@centos7 ~]$ singularity shell ubuntu_20.04.sif
Singularity> cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.3 LTS (Focal Fossa)"
ID=ubuntu
:
:
Singularity> hostname
centos7
Singularity> ls
Desktop cryoSPARC data pyenv src ubuntu_20.04.sif <-- 母体の$HOMEの内容が表示される
Singularity> exit
とプロンプトが「Singularity>」になり、「/etc/os-release」を参照にubuntu20.04に乗り移っている.
ホームディレクトリ、hostnameは母体から継承される. 「exit」で元に戻る.
dockerHUBにhttps://hub.docker.com/r/nvidia/cudaがあるのでそれをsifにしてみる
実際、ひっぱてくるものはhttps://hub.docker.com/r/nvidia/cuda/tagsのひとつ
[saber@centos7 ~]$ singularity pull docker://nvidia/cuda:11.4.2-cudnn8-devel-ubuntu20.04 <--- ubuntu20.04でcuda11.4.2が有効
[saber@centos7 ~]$ ls -l cuda_11.4.2-cudnn8-devel-ubuntu20.04.sif
-rwxr-xr-x 1 saber em 4951932928 Dec 19 20:22 cuda_11.4.2-cudnn8-devel-ubuntu20.04.sif
[saber@centos7 ~]$
っで試してみる. GPUを使うには「--nv」をオプションとしてつける --nv: enable experimental Nvidia support
[saber@centos7 ~]$ singularity shell --nv cuda_11.4.2-cudnn8-devel-ubuntu20.04.sif
Singularity> nvidia-smi -L
GPU 0: NVIDIA GeForce GT 710 (UUID: GPU-f0753e20-06f7-695a-f325-b5b6342393ba)
GPU 1: NVIDIA GeForce GT 710 (UUID: GPU-34c49ab7-b79d-e341-93e2-1659e9bd9e57)
Singularity> exit
[saber@centos7 ~]$
nvidia-dockerの整備とか不要で使える.
っとわ言ってもOSだけでは仕事はできない. 自分の使いたいアプリが入ったイメージが欲しいものである.
jupyterlabとかならそれが入ったdockerがdockerHubにあるので便利だけど、自分が望むアプリが入ったイメージを作るには
の2つの手法があるみたい
っでますは「sandbox」オプションを使ってみる.
[saber@centos7 ~]$ singularity build --sandbox ubuntu20.04 docker://nvidia/cuda:11.4.2-cudnn8-devel-ubuntu20.04
:
INFO: Creating sandbox directory...
INFO: Build complete: ubuntu20.04
[saber@centos7 ~]$
こうするとディレクトリとして「ubuntu20.04」ができる. 中身はubuntu20.04のシステム丸ごとみたい.
[saber@centos7 ~]$ ls -CF
Desktop/ cryoSPARC/ data/ pyenv/ src/ ubuntu20.04/ ubuntu_20.04.sif*
[saber@centos7 ~]$ ls -CF ubuntu20.04/
bin@ etc/ lib64@ NGC-DL-CONTAINER-LICENSE run/ sys/
boot/ home/ libx32@ opt/ sbin@ tmp/
dev/ lib@ media/ proc/ singularity@ usr/
environment@ lib32@ mnt/ root/ srv/ var/
[saber@centos7 ~]$ ls -CF ubuntu20.04/usr/local/
bin/ cuda-11@ etc/ include/ man@ share/
cuda@ cuda-11.4/ games/ lib/ sbin/ src/
[saber@centos7 ~]$ du -hs ./ubuntu20.04/ ubuntu_20.04.sif
8.6G ./ubuntu20.04/
27M ubuntu_20.04.sif
[saber@centos7 ~]$
作ったフォルダ「ubuntu20.04」にsingularityでアクセスは可能であるが、root権限でsingularityを動かさないとフォルダ「ubuntu20.04」の内部はいじれない.
[saber@centos7 ~]$ singularity shell ./ubuntu20.04/
Singularity> id
uid=1003(saber) gid=2001(em) groups=2001(em),978(docker)
Singularity> apt update
Reading package lists... Done
E: List directory /var/lib/apt/lists/partial is missing. - Acquire (30: Read-only file system)
Singularity>
そうするには、事前に「visudo」で特定ユーザにroot権限でsingularityを実行できるように調整する
[saber@centos7 ~]$ su -
[root@centos7 ~]# visudo
:
root ALL=(ALL) ALL
saber ALL=(ALL) /usr/bin/singularity
:
[root@centos7 ~]#
そうしてからフォルダ「ubuntu20.04」を調整する
[saber@centos7 ~]$ sudo singularity shell --writable ubuntu20.04
Singularity> id
uid=0(root) gid=0(root) groups=0(root)
Singularity> pwd
/root
Singularity> apt update
Singularity> apt install cmake git build-essential mpi-default-bin mpi-default-dev libfftw3-dev libtiff-dev libfltk1.3-dev libx11-dev libpng-dev
Singularity> git clone https://github.com/3dem/relion
Singularity> mkdir relion/build && cd $_
Singularity> git checkout ver4.0
Singularity> cmake .. && make install <--- 「ubuntu20.04」の/usr/local/bin にrelionがインストールされます.
Singularity> exit
[saber@centos7 ~]$
変更を加えた「ubuntu20.04」はそのまま利用してもいい
[saber@centos7 ~]$ singularity shell ubuntu20.04
Singularity> relion
あるいは、「ubuntu20.04」をsingulairty image fileに変換する。そうすれば配布も容易
[saber@centos7 ~]$ sudo singularity build ubuntu20.04-relion4.0b2.sif ubuntu20.04
[sudo] password for saber:
INFO: Starting build...
INFO: Creating SIF file...
INFO: Build complete: ubuntu20.04-relion4.0b2.sif
[saber@centos7 ~]$ ls -lh
drwxr-xr-x 18 saber em 4.0K Dec 19 11:43 ubuntu20.04
-rwxr-xr-x 1 saber em 390M Dec 19 12:34 ubuntu20.04-relion4.0b2.sif
-rwxr-xr-x 1 saber em 27M Dec 19 11:32 ubuntu_20.04.sif
[saber@centos7 ~]$
sifファイルを展開というか解凍します. 表現的に微妙ですが、意味はそんな感じ
[saber@centos7 ~]$ singularity build --sandbox ubuntu_20.04 ubuntu_20.04.sif
[saber@centos7 ~]$ ls -lF
total 27108
drwxr-xr-x. 18 saber saber 4096 Apr 20 00:37 ubuntu_20.04/
-rwxr-xr-x. 1 saber saber 27754496 Apr 20 00:40 ubuntu_20.04.sif*
[saber@centos7 ~]$
その後に「ubuntu_20.04/」に対して修正を加える
[saber@centos7 ~]$ singularity shell --writable ./ubuntu_20.04/
WARNING: Skipping mount /etc/localtime [binds]: /etc/localtime doesn't exist in container
Apptainer> touch /usr/local/bin/sample.sh
Apptainer> ls -l /usr/local/bin
total 0
-rw-rw-r--. 1 saber saber 0 Apr 19 15:44 sample.sh
Apptainer>
Apptainer> exit
exit
[saber@centos7 ~]$ singularity build ubuntu_20.04-mod.sif ubuntu_20.04/
INFO: Starting build...
INFO: Creating SIF file...
INFO: Build complete: ubuntu_20.04-mod.sif
[saber@centos7 ~]$ ls -lF
total 54212
drwxr-xr-x. 18 saber saber 4096 Apr 20 00:37 ubuntu_20.04/
-rwxr-xr-x. 1 saber saber 27754496 Apr 20 00:45 ubuntu_20.04-mod.sif*
-rwxr-xr-x. 1 saber saber 27754496 Apr 20 00:40 ubuntu_20.04.sif*
[saber@centos7 ~]$ singularity shell ubuntu_20.04-mod.sif
Apptainer> ls -l /usr/local/bin
total 1
-rw-rw-r--. 1 root root 0 Apr 20 00:44 sample.sh
Apptainer> exit
exit
[saber@centos7 ~]$
他にはdefファイルから作る
[saber@centos7 ~]$ cat alphafold.def
BootStrap: localimage
From: /home/sysosa/alphafold.sif
%post
touch /etc/sample
[saber@centos7 ~]$ singularity build --fakeroot alphafold2.sif alphafold.def
年て新しい「alphafold2.sif」を作るとか
あぷりはどちらへ?
Singularityを実行するとホームディレクトリ配下が起動したSingularityに移動する. その状態で作ったアプリは自分のホームディレクトリに於くことができるが、Singularityを起動しないと使えないアプリとなる.
Singularityのイメージ内にアプリを置けば、それを起動すればアプリが使えるとなる. ただ構築の際にroot権限が必要.
root権限を使用させるために sudo を与えているが、下記を実施すれば不要になる。
ただ、「singularity build --fakeroot af.sif af.def」とする必要が生じる
[root@centos7 ~]# echo "user.max_user_namespaces=10000" >> /etc/sysctl.conf
[root@centos7 ~]# sysctl -p
[root@centos7 ~]# singularity config fakeroot --add illya
(削除は)
[root@centos7 ~]# singularity config fakeroot --remove illy
そもそも user.max_user_namespaces が使えない場合もある. その場合は grub から直接有効にする.
[root@centos7 ~]# vi /etc/default/grub
:
GRUB_CMDLINE_LINUX="iommu=pt intel_iommu=on rd.driver.blacklist=nouveau nouveau.modeset=0 user_namespace.enable=1"
:
[root@centos7 ~]#
[root@centos7 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
[root@centos7 ~]# grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
パッケージがありました.
https://github.com/sylabs/singularity/releases
これを取得してインストールします
root@ubuntu22:~# cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.2 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.2 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
root@ubuntu22:~# cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module 535.104.05 Sat Aug 19 01:15:15 UTC 2023
GCC version: gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)
root@ubuntu22:~# nvidia-smi
Wed Sep 6 12:49:40 2023
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.104.05 Driver Version: 535.104.05 CUDA Version: 12.2 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA RTX A2000 Off | 00000000:0B:00.0 Off | Off |
| 30% 59C P0 25W / 70W | 1MiB / 6138MiB | 6% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| No running processes found |
+---------------------------------------------------------------------------------------+
root@ubuntu22:~#
(jammyなので)
root@ubuntu22:~# wget https://github.com/sylabs/singularity/releases/download/v4.0.0-rc.2/singularity-ce_3.11.4-jammy_amd64.deb
root@ubuntu22:~# apt-get install ./singularity-ce_3.11.4-jammy_amd64.deb
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Note, selecting 'singularity-ce' instead of './singularity-ce_3.11.4-jammy_amd64.deb'
The following additional packages will be installed:
crun libyajl2 uidmap
The following NEW packages will be installed:
crun libyajl2 singularity-ce uidmap
0 upgraded, 4 newly installed, 0 to remove and 51 not upgraded.
Need to get 343 kB/31.9 MB of archives.
After this operation, 135 MB of additional disk space will be used.
Do you want to continue? [Y/n]
:
:
No VM guests are running outdated hypervisor (qemu) binaries on this host.
N: Download is performed unsandboxed as root as file '/root/singularity-ce_3.11.4-jammy_amd64.deb' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)
root@ubuntu22:~#
root@ubuntu22:~# singularity --version
singularity-ce version 3.11.4-jammy
root@ubuntu22:~#
テスト
saber@ubuntu22:~$ singularity build --sandbox ubunt2004 docker://nvidia/cuda:12.2.0-devel-ubuntu20.04
saber@ubuntu22:~$ du -hs ./ubunt2004/
6.2G ./ubunt2004/
saber@ubuntu22:~$
saber@ubuntu22:~$ singularity shell ubunt2004
Singularity> id
uid=1000(saber) gid=1000(saber) groups=1000(saber),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),110(lxd)
Singularity> exit
exit
saber@ubuntu22:~$
saber@ubuntu22:~$ singularity shell --fakeroot ubunt2004
WARNING: underlay of /etc/localtime required more than 50 (75) bind mounts
Singularity> id
uid=0(root) gid=0(root) groups=0(root)
Singularity> exit
exit
saber@ubuntu22:~$
fakeroot がそのまま使えそうなのかな?
「singularity pull」とかで外部のイメージを取得する際にproxy経由が必要なら環境変数HTTP_PROXYとHTTPS_PROXYが必要みたい
export HTTP_PROXY=${HTTP_PROXY}
export HTTPS_PROXY=${HTTPS_PROXY}
[root@slurm ~]# singularity config fakeroot --add illya
[illya@slurm ~]$ singularity build --sandbox ubuntu-jammy docker://ubuntu:jammy
[illya@slurm ~]$ singularity shell --writable --fakeroot ubuntu-jammy/
WARNING: Skipping mount /etc/localtime [binds]: /etc/localtime doesn't exist in container
Singularity>
「/etc/localtime doesn't exist in container」と表示される. 回避策は
Singularity> apt update
Singularity> apt install tzdata
「6. Asia」を選んで「79. Tokyo」を選ぶ. 再度設定したい場合は「dpkg-reconfigure tzdata」をたたく
Singularity> exit
[illya@slurm ~]$
[illya@slurm ~]$ singularity shell --writable --fakeroot ubuntu-jammy/
Singularity>
次回から警告は出ないです.
これは[--writable]を使う場合に発生します. 普通に使う分には表示されないです
[illya@slurm ~]$ singularity shell ubuntu-jammy/
Singularity>