一个Python包,使用户能够在HPC集群上构建自定义singularity镜像
项目描述
使用globus-compute在HPC上构建一个单容器
上下文
-
globus-compute的执行配置之一需要一个已注册的容器,该容器被启动以在HPC上执行用户函数。
-
HPC不运行docker容器(由于安全原因,如此处所述)并且仅支持apptainer/singularity镜像。
-
在本地构建singularity镜像的apptainer设置安装不是一个简单的过程,尤其是在Windows和mac系统上,如文档中所述。
使用这个Python库,用户可以指定他们的自定义图像规范来构建apptainer/singularity图像,该图像将用于在globus-compute上运行他们的函数。库注册容器并返回容器ID,该ID将被globus-compute执行器用于执行用户函数。
先决条件。
在HPC集群上设置了globus-compute-endpoint。
以下步骤可以用于在NCSA Delta集群上创建端点,您可以根据您的用例修改配置:
注意。
为了使以下内容生效,我们必须在设置端点时使用globus-compute-sdk版本2.2.0。建议使用python3.9来设置端点并作为客户端。
- 创建一个conda虚拟环境。我们已在delta集群上创建了
custom-image-builder
conda环境,如下所示:
conda create --name custom-image-builder-py-3.9 python=3.9
conda activate custom-image-builder
pip install globus-compute-endpoint==2.2.0
- 创建globus-compute端点
globus-compute-endpoint configure custom-image-builder
在~/.globus_compute/custom-image-builder/config.py
中更新端点配置
from parsl.addresses import address_by_interface
from parsl.launchers import SrunLauncher
from parsl.providers import SlurmProvider
from globus_compute_endpoint.endpoint.utils.config import Config
from globus_compute_endpoint.executors import HighThroughputExecutor
user_opts = {
'delta': {
'worker_init': 'conda activate custom-image-builder-py-3.9',
'scheduler_options': '#SBATCH --account=bbmi-delta-cpu',
}
}
config = Config(
executors=[
HighThroughputExecutor(
max_workers_per_node=10,
address=address_by_interface('hsn0'),
scheduler_mode='soft',
worker_mode='singularity_reuse',
container_type='singularity',
container_cmd_options="",
provider=SlurmProvider(
partition='cpu',
launcher=SrunLauncher(),
# string to prepend to #SBATCH blocks in the submit
# script to the scheduler eg: '#SBATCH --constraint=knl,quad,cache'
scheduler_options=user_opts['delta']['scheduler_options'],
worker_init=user_opts['delta']['worker_init'],
# Command to be run before starting a worker, such as:
# 'module load Anaconda; source activate parsl_env'.
# Scale between 0-1 blocks with 2 nodes per block
nodes_per_block=1,
init_blocks=0,
min_blocks=0,
max_blocks=1,
# Hold blocks for 30 minutes
walltime='00:30:00'
),
)
],
)
- 启动端点并将端点ID存储在以下示例中
globus-compute-endpoint start custom-image-builder
示例
考虑以下用例,其中用户想在HPC上使用globus-compute执行pandas操作。他们需要一个由globus-compute执行器使用的singularity图像。可以使用以下方式利用库:
本地您需要安装以下包,您可以创建虚拟环境如下:
cd example/
python3.9 -m venv venv
source venv/bin/activate
pip install globus-compute-sdk==2.2.0
pip install custom-image-builder
from custom_image_builder import build_and_register_container
from globus_compute_sdk import Client, Executor
def transform():
import pandas as pd
data = {'Column1': [1, 2, 3],
'Column2': [4, 5, 6]}
df = pd.DataFrame(data)
return "Successfully created df"
def main():
image_builder_endpoint = "bc106b18-c8b2-45a3-aaf0-75eebc2bef80"
gcc_client = Client()
container_id = build_and_register_container(gcc_client=gcc_client,
endpoint_id=image_builder_endpoint,
image_file_name="my-pandas-image",
base_image_type="docker",
base_image="python:3.8",
pip_packages=["pandas"])
print("The container id is", container_id)
with Executor(endpoint_id=image_builder_endpoint,
container_id=container_id) as ex:
fut = ex.submit(transform)
print(fut.result())
注意。
由于singularity图像需要globus-compute-endpoint作为其包之一以运行作为我们自定义singularity容器的工作者,因此默认情况下我们需要在图像中包含python以便安装globus-compute-endpoint。