コンテンツにスキップ

ABCI Singularity エンドポイント

概要

ABCI Singularity エンドポイントでは、ABCI 内部向けに Singularity Container サービスを提供しています。このサービスは、SingularityPRO で用いるコンテナイメージをリモートビルドするための Remote Builder と、作成したコンテナイメージを保管・共有するための Container Library から成ります。ABCI 内部向けのサービスであるため、外部から直接アクセスすることはできません。

以下では、ABCI において本サービスを利用するための基本的な操作を説明します。詳細は Sylabs 社のドキュメントを参照下さい。

事前準備

モジュールのロード

本サービスを利用するため、以下のように SingularityPRO のモジュールをロードして下さい。

[username@es1 ~]$ module load singularitypro

アクセストークンの取得

Note

ABCI Singularity エンドポイントのアップデートに伴い、2023年3月以前に取得したアクセストークンは使用できなくなりました。そのため、再度アクセストークンを取得後、アクセストークンの登録を実施してください。

最初に、本サービスの認証に必要なアクセストークンを取得します。 インタラクティブノードで get_singularity_token コマンドを実行して下さい。発行には ABCI のパスワード (利用者ポータルへのログインに使用するパスワード) の入力が必要です。

[username@es1 ~]$ get_singularity_token
ABCI portal password :
just a moment, please...
  (The generated access token will be displayed.)

取得したアクセストークンは、この後の登録に必要になりますので、安全なところに控えておいて下さい。

Note

アクセストークンは、非常に長い1行の文字列で作られているため、途中に改行などが入らないよう注意して下さい。

リモートエンドポイントの設定確認

singularity remote list を実行し、本サービスを提供している ABCI Singularity エンドポイント(cloud.se2.abci.local)が、リモートエンドポイントとして正しく設定されていることを確認して下さい。

[username@es1 ~]$ singularity remote list

NAME         URI                   DEFAULT?  GLOBAL?  EXCLUSIVE?  SECURE?
ABCI         cloud.se2.abci.local                               
SylabsCloud  cloud.sylabs.io                                     
[username@es1 ~]$

Note

singularity remote listコマンドの出力において、使用している端末により各列に?マークが表示される場合があります。その場合は?マークをチェックマークに読み替えてください。

Note

SylabsCloud は Sylabs が運営するパブリックサービスのエンドポイントです。https://cloud.sylabs.io/ にサインインし、アクセストークンを取得することで利用可能になります。

Note

Singularity のコンテナイメージは、Singularity Global Client を用いて取得することも可能です。詳細はSingularity Global Clientの利用を参照して下さい。

アクセストークンの登録

ABCI Singularity エンドポイントに対して、singularity remote login を実行し、先に取得したアクセストークンを入力し、自身の SingularityPRO の設定ファイルに登録します。

[username@es1 ~]$ singularity remote login ABCI
Generate an access token at https://cloud.se2.abci.local/auth/tokens, and paste it here.
Token entered will be hidden for security.
Access Token:
INFO:    Access Token Verified!
INFO:    Token stored in /home/username/.singularity/remote.yaml
[username@es1 ~]$

アクセストークンを再取得した際にも、上記コマンドを再実行し、アクセストークンを再登録して下さい。既存のアクセストークンは上書きされます。

Note

現在、アクセストークンの有効期限は1年に設定されています。

Remote Builder

最初に、コンテナイメージをビルドするための定義ファイルを作成して下さい。以下の例では、Docker Hub から取得した Ubuntu のコンテナイメージをベースとして、追加パッケージのインストールと、コンテナを実行した時に実行されるコマンドを指定しています。定義ファイルの詳細については、Definition Files を参照して下さい。

[username@es1 ~]$ vi ubuntu.def
[username@es1 ~]$ cat ubuntu.def
Bootstrap: docker
From: ubuntu:18.04

%post
    apt-get update
    apt-get install -y lsb-release

%runscript
    lsb_release -d

[username@es1 ~]$ 

次に、singularity build コマンドに --remote を指定して、ubuntu.def の内容からコンテナイメージ ubuntu.sif をリモートビルドで作成して下さい。

[username@es1 ~]$ singularity build --remote ubuntu.sif ubuntu.def
INFO:    Remote "cloud.se2.abci.local" added.
INFO:    Access Token Verified!
INFO:    Token stored in /root/.singularity/remote.yaml
INFO:    Remote "cloud.se2.abci.local" now in use.
INFO:    Starting build...
:
:
INFO:    Build complete: ubuntu.sif
[username@es1 ~]$ 

動作確認として singularity run でコンテナイメージを起動する例を以下に示します。定義ファイル内で指定した lsb_release -d が実行され、その結果が出力されています。

[username@es1 ~]$ qrsh -g grpname -l rt_C.small=1 -l h_rt=1:00:00
[username@g0001 ~]$ module load singularitypro
[username@g0001 ~]$ singularity run ubuntu.sif
Description:    Ubuntu 18.04.6 LTS
[username@g0001 ~]$ 

Container Library (Experimental)

作成したコンテナイメージを Container Library にアップロードし、他の ABCI 利用者に公開することができます。1人あたり、合計 100GiB までアップロードして保存することができます。

Note

Container Library にアップロードしたコンテナイメージに対して、アクセス制御の設定はできません。つまり、ABCIの利用者であれば誰でもアクセス可能になりますので、アップロードするイメージが適切なものであるか十分に確認して下さい。

コンテナイメージの署名鍵の作成と登録

Container Library へコンテナイメージをアップロードして、ABCI 内に公開する場合には、事前に鍵ペアを作成し、KeyStore に公開鍵を登録して下さい。コンテナイメージの作成者は、秘密鍵を用いてコンテナイメージに署名し、コンテナイメージの利用者は KeyStore に登録されている公開鍵を用いてその署名を検証することが可能です。

鍵ペアの作成

singularity key newpair により鍵ペアを作成します。

[username@es1 ~]$ singularity key newpair
Enter your name (e.g., John Doe) : 
Enter your email address (e.g., john.doe@example.com) : 
Enter optional comment (e.g., development keys) : 
Enter a passphrase : 
Retype your passphrase :
Would you like to push it to the keystore? [Y,n] 
Generating Entity and OpenPGP Key Pair... done

各入力値の説明は以下のとおりです。

項目 入力値
Enter your name ABCIアカウント名を入力してください。
Enter your email address email address となっていますが、ABCIアカウント名を入力して下さい。
Enter optional comment この鍵ペアにつけておきたい任意のコメントを入力します。
Enter a passphrase パスフレーズを決めて入力して下さい。コンテナイメージを署名する時などに必要になります。
Would you like to push it to the keystore? 公開鍵を Keystore にアップロードする場合は Y を入力して下さい。

鍵の一覧表示

singularity key list を実行すると、作成した鍵も含め、ローカルの鍵リングに入っている公開鍵の情報を確認できます。

[username@es1 ~]$ singularity key list
Public key listing (/home/username/.singularity/sypgp/pgp-public):
:
:
   --------
7) U: username (comment) <username>
   C: 2020-06-15 03:40:05 +0900 JST
   F: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
   L: 4096
   --------
[username@es1 ~]$

Keystore に登録されている鍵情報を取得するには、singularity key search -l に ABCIアカウント名を指定します。

[username@es1 ~]$ singularity key search -l username
Showing 1 results

FINGERPRINT                               ALGORITHM  BITS  CREATION DATE                  EXPIRATION DATE  STATUS     NAME/EMAIL
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY  RSA        4096  2020-06-15 03:40:05 +0900 JST  [ultimate]       [enabled]  username (comment) <username>

[username@es1 ~]$

Keystore への公開鍵の登録

鍵ペアの作成時に、Keystore へのアップロードを指定しなかった場合、あとからアップロードすることもできます。

Warning

Keystore に登録した公開鍵を削除することはできません。

[username@es1 ~]$ singularity key list
0) U: username (comment) username
   C: 2020-08-08 04:28:35 +0900 JST
   F: ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
   L: 4096
   --------

この 0 番の公開鍵をアップロードするには、F: のところに表示されているフィンガープリントを singularity key push に指定します。

[username@es1 ~]$ singularity key push ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
public key `ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ' pushed to server successfully

[username@es1 ~]$ singularity key search -l username
Showing 1 results

FINGERPRINT                               ALGORITHM  BITS  CREATION DATE                  EXPIRATION DATE  STATUS     NAME/EMAIL
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ  RSA        4096  2020-06-15 03:40:05 +0900 JST  [ultimate]       [enabled]  username (comment) <username>

Keystore に登録されている公開鍵の取得

Keystore に登録されている公開鍵は、ダウンロードして自分の鍵リングに保存することができます。以下の例では、username2 で検索して見つけた公開鍵をダウンロードして、保存しています。鍵につけられたコメントにマッチする文字列を指定して検索することもできます。singularity key pull には、フィンガープリントを指定します。

[username@es1 ~]$ singularity key search -l username2
Showing 2 results

FINGERPRINT                               ALGORITHM  BITS  CREATION DATE                  EXPIRATION DATE  STATUS     NAME/EMAIL
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA  RSA        4096  2020-06-22 11:51:45 +0900 JST  [ultimate]       [enabled]  username2 (comment) <username2>

[username@es1 ~]$ singularity key pull AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
1 key(s) added to keyring of trust /home/username/.singularity/sypgp/pgp-public
[username@es1 ~]$ singularity key list
:
:
1) U: username2 (comment) <username2>
   C: 2020-08-10 11:51:45 +0900 JST
   F: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
   L: 4096
   --------
[username@es1 ~]$

鍵の削除

自分の鍵リングに登録されている公開鍵は、singularity key remove に鍵のフィンガープリントを指定して削除することができます。Keystore に登録された公開鍵を削除することはできません。

[username@es1 ~]$ singularity key remove AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

コンテナイメージのアップロード

Container Library にアップロードする前に、コンテナイメージに署名します。 singularity key list -s で鍵の番号を確認し、singularity sign で署名します。 -k オプションで鍵の番号を指定して下さい。以下の例では 2 番の鍵を使用して、ubuntu.sif へ署名しています。

[username@es1 ~]$ singularity key list -s
Public key listing (/home/username/.singularity/sypgp/pgp-secret):
:
:
   --------
2) U: username (comment) <username>
   C: 2020-06-15 03:40:05 +0900 JST
   F: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
   L: 4096
   --------
[username@es1 ~]$ singularity sign -k 2 ./ubuntu.sif
Signing image: ./ubuntu.sif
Enter key passphrase : 
Signature created and applied to ./ubuntu.sif

Container Library におけるコンテナイメージの場所は、library://username/collection/repository:tag という形式の URI で表されます。下記の各構成要素の説明を参照し、アップロード先となる URI を決定してください。

項目名
username 自分のABCIアカウント名を指定します。
collection コレクション名を任意の文字列で指定します。
repository リポジトリ名を任意の文字列で指定します。
tag 同じコンテナイメージを識別するための文字列です。バージョンやリリース日、リビジョン番号や latest などの文字列で指定します。

コレクション名を abci-lib、 リポジトリ名を ubuntu、タグとして latest を指定してアップロードする例を以下に示します。

[username@es1 ~]$ singularity push ubuntu.sif library://username/abci-lib/ubuntu:latest
INFO:    Container is trusted - run 'singularity key list' to list your trusted keys
 35.36 MiB / 35.36 MiB [===========================================================================================================================================================================================================] 100.00% 182.68 MiB/s 0s
[username@es1 ~]$

コンテナイメージのダウンロード

Container Library にアップロードされたコンテナイメージは、以下のようにダウンロードできます。

[username@es1 ~]$ singularity pull library://username/abci-lib/ubuntu:latest
INFO:    Downloading library image
 35.37 MiB / 35.37 MiB [=============================================================================================================================================================================================================] 100.00% 353.47 MiB/s 0s
INFO:    Download complete: ubuntu_latest.sif
[username@es1 ~]$

署名が検証できない場合は、以下のような WARNING メッセージが出力されますが、ダウンロードは行われます。

WARNING: Skipping container verification

ダウンロードした後に singularity verify を使って署名を検証することもできます。 以下の例では、Keystore に登録されている公開鍵で署名が検証されています。自分の鍵リングに登録されている公開鍵で検証された場合は、REMOTE ではなく LOCAL と出力されます。検証できなかった場合は WARNING メッセージが出力されます。

[username@es1 ~]$ singularity verify ubuntu_latest.sif
Verifying image: ubuntu_latest.sif
[REMOTE]  Signing entity: username (comment) <username>
[REMOTE]  Fingerprint: BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
Objects verified:
ID  |GROUP   |LINK    |TYPE
------------------------------------------------
1   |1       |NONE    |Def.FILE
2   |1       |NONE    |JSON.Generic
3   |1       |NONE    |FS
Container verified: ubuntu_latest.sif

Note

検証に失敗した場合でもコンテナイメージを実行することはできますが、検証可能なコンテナイメージの使用を推奨します。

コンテナイメージの検索

Container Library にアップロードされたコンテナイメージをキーワードで検索することができます。

[username@es1 ~]$ singularity search hello
No users found for 'hello'

No collections found for 'hello'

Found 1 containers for 'hello'
    library://username/abci-lib/helloworld
        Tags: latest

コンテナイメージの削除

Container Library にアップロードされたコンテナイメージは、singularity delete で削除することができます。

[username@es1 ~]$ singularity delete library://username/abci-lib/helloworld:latest

Note

library://username/abci-lib/helloworld:latest のように、タグやIDを指定してコンテナイメージを削除することはできますが、library://username/abci-lib/helloworld のようにコンテナの名前そのものを削除することはできません。

コンテナイメージ一覧表示

Container Library にアップロードされたコンテナイメージ一覧情報を表示することができます。 コレクション名一覧はsingularity enterprise get colで表示できます。その際、引数としてABCIアカウント名を指定します。

[username@es1 ~]$ singularity enterprise get col username
ID                         Name            Num. Containers
username/tensorflow-test tensorflow-test 1
username/ubuntu-test     ubuntu-test     2
[username@es1 ~]$

コレクション内のリポジトリ一覧はsingularity enterprise get repで表示できます。その際、引数としてsingularity enterprise get colで表示されるIDを指定します。

[username@es1 ~]$ singularity enterprise get rep username/ubuntu-test
ID                             Name    Description Images Tags Size      DownloadCount
username/ubuntu-test/ubuntu    ubuntu              1      0     64.0 MiB 3
username/ubuntu-test/ubuntu2   ubuntu2             1      0     67.0 MiB 5
[username@es1 ~]$

コンテナイメージの情報はsingularity enterprise get imgで表示できます。その際、引数としてsingularity enterprise get repで表示されるIDを指定します。

[username@es1 ~]$ singularity enterprise get img username/ubuntu-test/ubuntu2
ID                                                                                                     Tags              Arch  Description Size      Signed Encrypted Uploaded
username/ubuntu-test/ubuntu2:sha256.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   [20221118 latest] amd64              67.0 MiB true   false     true
[username@es1 ~]$

Container Libraryの使用量表示

Container Libraryの使用量を、show_container_library_usage で表示することができます。表示の際には ABCI のパスワードの入力が必要です。

[username@es1 ~]$ show_container_library_usage
ABCI portal password :
just a moment, please...
used(GiB) limit(GiB) num_of_repositories
3         100        6

アクセストークン

ここでは、取得したアクセストークンに関するコマンドを説明します。

アクセストークン一覧表示

アクセストークンの一覧を、list_singularity_tokensで表示することができます。表示の際には ABCI のパスワードの入力が必要です。

[username@es1 ~]$ list_singularity_tokens
ABCI portal password :
just a moment, please...

Token ID: XXXXXXXXXXXXXXXXXXXXXXXX
Issued: Apr 5, 2023 at 6:55 pm JST
Expires: Apr 4, 2024 at 6:55 pm JST

Token ID: XXXXXXXXXXXXXXXXXXXXXXXX
Issued: Apr 6, 2023 at 12:14 pm JST
Expires: Apr 5, 2024 at 12:14 pm JST

アクセストークンの無効化

取得したアクセストークンは、singularity enterprise delete tokenで無効にすることができます。list_singularity_tokensで表示されたアクセストークン一覧から、無効にしたい Token ID を引数として指定します。

[username@es1 ~]$ singularity enterprise delete token <Token ID>
INFO:    Revoking token XXXXXXXXXXXXXXXXXXXXXXXX
[username@es1 list_singularity_tokens]$