From d90c83a23c6746c1f96c4316d7a7eee12e490528 Mon Sep 17 00:00:00 2001 From: Ian Lumsden Date: Tue, 27 Aug 2024 22:45:18 -0400 Subject: [PATCH] HPCIC 2024: Updates and Fixes DYAD Component of Tutorial (#43) * dyad: fixes content and DYAD data dyad data loader This commit corrects logic in the the PyTorch data loader for DYAD. It also makes various corrections to the text in the DYAD notebook. * docker: adds workaround regarding Ubuntu Jammy The flux-sched image for Ubuntu Jammy has a system install of UCX 1.12.0. However, we are wanting to use UCX 1.13.1 with DYAD. This commit updates LD_LIBRARY_PATH to point to UCX 1.13.1 to prevent runtime issues with DYAD. * dyad: updates the env file for DYAD notebook In light of the name change of DLIO Profiler to DFTracer, this commit updates the env file created in the DYAD notebook to use the new names for environment variables. * dyad: fixes bug in DYAD data loader This commit fixes a bug in the DYAD PyTorch data loader that causes 'brokers_per_node' to not be set before reference. * dyad: update multiprocessing approach for DLIO This commit tweaks the DLIO config file to use forking for multiprocessing instead of spawning * dyad: changes cpu-affinity for DLIO This commit changes cpu-affinity to off when running DLIO for training for consistency --------- Co-authored-by: Hariharan --- .../JupyterNotebook/docker/Dockerfile.spawn | 9 +++- .../configs/workload/dyad_unet3d_demo.yaml | 4 +- .../dlio_extensions/dyad_torch_data_loader.py | 8 ++- .../supplementary/dyad/dyad_dlio.ipynb | 50 ++++++++++-------- .../supplementary/dyad/img/dl-training-io.png | Bin 0 -> 36427 bytes 5 files changed, 41 insertions(+), 30 deletions(-) create mode 100755 2024-HPCIC-AWS/JupyterNotebook/tutorial/supplementary/dyad/img/dl-training-io.png diff --git a/2024-HPCIC-AWS/JupyterNotebook/docker/Dockerfile.spawn b/2024-HPCIC-AWS/JupyterNotebook/docker/Dockerfile.spawn index d0965ae..81fbe4b 100644 --- a/2024-HPCIC-AWS/JupyterNotebook/docker/Dockerfile.spawn +++ b/2024-HPCIC-AWS/JupyterNotebook/docker/Dockerfile.spawn @@ -91,7 +91,7 @@ RUN apt-get update && apt-get install -y nodejs && apt-get clean && rm -rf /var/ RUN wget https://nodejs.org/dist/v20.15.0/node-v20.15.0-linux-x64.tar.xz && \ apt-get update && apt-get install -y xz-utils && rm -rf /var/lib/apt/lists/* && \ xz -d -v node-v20.15.0-linux-x64.tar.xz && \ - tar -C /usr/local --strip-components=1 -xvf node-v20.15.0-linux-x64.tar + tar -C /usr/local --strip-components=1 -xvf node-v20.15.0-linux-x64.tar # This customizes the launcher UI # https://jupyter-app-launcher.readthedocs.io/en/latest/usage.html @@ -113,6 +113,11 @@ COPY ./docker/flux-icon.png $HOME/flux-icon.png # note that previous examples are added via git volume in config.yaml ENV SHELL=/usr/bin/bash ENV FLUX_URI_RESOLVE_LOCAL=t +# Prepend /usr/lib to LD_LIBRARY_PATH because Ubuntu Jammy comes with +# UCX 1.12. Without this, DYAD will build (correctly) with UCX 1.13.1, but +# it will try to run with the system install of UCX 1.12, which can cause +# either a crash or a hang. +ENV LD_LIBRARY_PATH="/usr/lib:$LD_LIBRARY_PATH" EXPOSE 8888 ENTRYPOINT ["tini", "--"] @@ -132,7 +137,7 @@ RUN mkdir -p $HOME/.local/share && \ # flux start flux account add-user --username=jovyan --bank=default && \ # flux start flux jobtap load mf_priority.so && \ # flux start flux account-update-db - + USER ${NB_USER} CMD ["flux", "start", "--test-size=4", "jupyter", "lab"] diff --git a/2024-HPCIC-AWS/JupyterNotebook/tutorial/supplementary/dyad/dlio_extensions/configs/workload/dyad_unet3d_demo.yaml b/2024-HPCIC-AWS/JupyterNotebook/tutorial/supplementary/dyad/dlio_extensions/configs/workload/dyad_unet3d_demo.yaml index 27641a3..aca49d6 100644 --- a/2024-HPCIC-AWS/JupyterNotebook/tutorial/supplementary/dyad/dlio_extensions/configs/workload/dyad_unet3d_demo.yaml +++ b/2024-HPCIC-AWS/JupyterNotebook/tutorial/supplementary/dyad/dlio_extensions/configs/workload/dyad_unet3d_demo.yaml @@ -20,7 +20,7 @@ reader: read_threads: 1 file_shuffle: seed sample_shuffle: seed - multiprocessing_context: spawn + multiprocessing_context: fork data_loader_classname: dyad_torch_data_loader.DyadTorchDataLoader data_loader_sampler: index @@ -32,4 +32,4 @@ checkpoint: checkpoint_folder: checkpoints/unet3d checkpoint_after_epoch: 5 epochs_between_checkpoints: 2 - model_size: 499153191 \ No newline at end of file + model_size: 499153191 diff --git a/2024-HPCIC-AWS/JupyterNotebook/tutorial/supplementary/dyad/dlio_extensions/dyad_torch_data_loader.py b/2024-HPCIC-AWS/JupyterNotebook/tutorial/supplementary/dyad/dlio_extensions/dyad_torch_data_loader.py index 21f652a..f6819e4 100644 --- a/2024-HPCIC-AWS/JupyterNotebook/tutorial/supplementary/dyad/dlio_extensions/dyad_torch_data_loader.py +++ b/2024-HPCIC-AWS/JupyterNotebook/tutorial/supplementary/dyad/dlio_extensions/dyad_torch_data_loader.py @@ -48,11 +48,11 @@ def __init__(self, format_type, dataset_type, epoch, num_samples, num_workers, b self.reader = None self.num_images_read = 0 self.batch_size = batch_size + self.broker_per_node = 1 args = ConfigArguments.get_instance() self.serial_args = pickle.dumps(args) if num_workers == 0: self.worker_init(-1) - self.broker_per_node = 1 def worker_init(self, worker_id): # Configure PyTorch components @@ -138,12 +138,10 @@ def read(self): prefetch_factor = math.ceil(self._args.prefetch_size / self._args.read_threads) else: prefetch_factor = self._args.prefetch_size - if prefetch_factor > 0: - if self._args.my_rank == 0: - else: + if prefetch_factor <= 0: prefetch_factor = 2 if self._args.my_rank == 0: - logging.debug(f"{utcnow()} Setup dataloader with {self._args.read_threads} workers {torch.__version__}") + logging.debug(f"{utcnow()} Setup dataloader with {self._args.read_threads} workers {torch.__version__}") if self._args.read_threads==0: kwargs={} else: diff --git a/2024-HPCIC-AWS/JupyterNotebook/tutorial/supplementary/dyad/dyad_dlio.ipynb b/2024-HPCIC-AWS/JupyterNotebook/tutorial/supplementary/dyad/dyad_dlio.ipynb index 8d5f583..dfcb5a6 100644 --- a/2024-HPCIC-AWS/JupyterNotebook/tutorial/supplementary/dyad/dyad_dlio.ipynb +++ b/2024-HPCIC-AWS/JupyterNotebook/tutorial/supplementary/dyad/dyad_dlio.ipynb @@ -9,7 +9,7 @@ "source": [ "# Using DYAD to accelerate distributed Deep Learning (DL) training\n", "\n", - "Now that we have seen how Flux enables the management and deployment of services, let's look at an example of using DYAD, an advanced Flux service for runtime data movement, in a real world application. Specifically, we will show how DYAD speeds up distributed Deep Learning (DL) training. In this module, we cover these topics:\n", + "Now that we have seen how Flux enables the management and deployment of services, let's look at an example of using DYAD, an advanced Flux service for runtime data movement, in a real-world application. Specifically, we will show how DYAD speeds up distributed Deep Learning (DL) training. In this module, we cover these topics:\n", "1. Design of DYAD\n", "2. Distributed DL training\n", "3. Deep Learning I/O (DLIO) benchmark\n", @@ -17,12 +17,12 @@ "\n", "## Design of DYAD\n", "\n", - "DYAD provides transparent, locality-aware, write-once, read-many file caching that runs on top of local NVMe and other burst buffer-style technologies (e.g., El Capitan Rabbit nodes). Figure X shows the components of DYAD, including the DYAD service (implemented as a Flux broker module), the DYAD client, and DYAD's data transport layer. DYAD uses the Flux KVS to store metadata about tracked files, and it uses Flux's remote proceedure call capabilities to communicate between client and service. DYAD also uses UCX to perform RDMA-based data transfer to move files.\n", + "DYAD provides transparent, locality-aware, write-once, read-many file caching that runs on top of local NVMe and other burst buffer-style technologies (e.g., El Capitan Rabbit nodes). Figure 1 shows the components of DYAD, including the DYAD service (implemented as a Flux broker module), the DYAD client, and DYAD's data transport layer. DYAD uses the Flux KVS to store metadata about tracked files, and it uses Flux's remote procedure call capabilities to communicate between client and service. DYAD also uses UCX to perform RDMA-based data transfer to move files.\n", "\n", "
\n", "\n", "
\n", - "Image created by Ian Lumsden for a poster at SC'23
\n", + "Figure 1: Image created by Ian Lumsden for a poster at SC'23\n", "
\n", "\n", "DYAD is designed to accelerate large, distributed workloads, such as distributed Deep Learning (DL) training and scientific computing workflows, on HPC systems. It is also designed be transparent, which allows users to leverage DYAD with little to no code refactoring. Unlike similar tools (e.g., DataSpaces and UnifyFS), which tend to optimize for write performance, DYAD aims to provide good write **and read** performance. To optimize read performance, DYAD uses a locality-aware \"Hierarchical Data Locator,\" which prioritizes node-local metadata and data retrieval to minimize the amount of network communications. When moving data from another node, DYAD also uses a streaming RPC over RDMA protocol, which uses preallocated buffers and connection caching to maximize network bandwidth. This process is shown in the figure below:\n", @@ -30,7 +30,7 @@ "
\n", "\n", "
\n", - "Image created by Hari Devarajan for a paper submitted to SC'24
\n", + "Figure 2: Image created by Hari Devarajan for a paper submitted to SC'24\n", "
" ] }, @@ -41,20 +41,20 @@ "source": [ "## Distributed DL Training\n", "\n", - "Distributed DL training is an approach to speed up the training of large Deep Learning models by performing multiple epochs of training in parallel across multiple GPUs and, oftentimes, multiple nodes. This approach is supported by most major DL libraries, such as PyTorch and Tensorflow. In this module, we focus on PyTorch. When running training across multiple nodes and GPUs, PyTorch starts by spawning one process per GPU, called the worker. Each worker performs three major tasks:\n", + "Distributed DL training is an approach to speed up the training of large Deep Learning models by performing multiple epochs of training in parallel across multiple GPUs and, oftentimes, multiple nodes. Most major DL libraries, such as PyTorch and TensorFlow support this approach. In this module, we focus on PyTorch. When running training across multiple nodes and GPUs, PyTorch starts by spawning one process per GPU, called the worker. Each worker performs three major tasks:\n", "1. Determining which samples from the dataset will comprise the batch for the next epoch of training (i.e., epoch *N+1*)\n", "2. Reading these samples from the filesystem\n", "3. Building a batch from these samples and moving the batch to the GPU\n", "\n", - "To assist with reading the samples from the filesystem, each worker also spawns additional I/O processes. Each of these processes reads data and, optionally, transforms the data based on the configuration of the training pipeline. Figure X shows this process for a single GPU, a single worker, and a single spawned I/O process. In this figure, \"I/O\" indicates data being read from the filesystem, and \"Map\" indicates the optional transformation of data. \"Batch\" indicates the building of a batch from the read samples.\n", + "To assist with reading the samples from the filesystem, each worker also spawns additional I/O processes. Each of these processes reads data and, optionally, transforms the data based on the configuration of the training pipeline. Figure 3 shows this process for a single GPU, a single worker, and a single spawned I/O process. In this figure, \"I/O\" indicates data being read from the filesystem, and \"Map\" indicates the optional transformation of data. \"Batch\" indicates the building of a batch from the read samples.\n", "\n", "
\n", "\n", "
\n", - "Image created by Ian Lumsden based on an image from this article
\n", + "Figure 3: Image created by Ian Lumsden based on an image from this article\n", "
\n", "\n", - "One key difference between distributed DL training and many conventional HPC applications (e.g., MPI-based simulations) is the asynchronous loading of data by workers during training. In many conventional HPC applications, data loading and computation are performed one after the one. On the other hand, as shown in Figure X, the loading of data in distributed DL training is asynchronous. In other words, while the GPU is training the DL model for epoch *N*, the worker reading and creating the batch for epoch *N+1*. This asynchronous loading of data can lead to imbalance between data loading and training. For example, Figure X shows a scenario where the data loading takes longer than training, resulting in idle time on the GPU, wasted resources, and, overall, an I/O bound application.\n", + "One key difference between distributed DL training and many conventional HPC applications (e.g., MPI-based simulations) is the asynchronous loading of data by workers during training. In many conventional HPC applications, data loading and computation are performed one after the other. On the other hand, as shown in Figure 3, the loading of data in distributed DL training is asynchronous. In other words, while the GPU is training the DL model for epoch *N*, the worker is reading and creating the batch for epoch *N+1*. This asynchronous loading of data can lead to an imbalance between data loading and training. For example, Figure 3 shows a scenario where the data loading takes longer than training, resulting in idle time on the GPU, wasted resources, and, overall, an I/O bound application.\n", "\n", "At the end of each epoch of training, all workers and GPUs are synchronized so that the DL models from each GPU can be merged together. This synchronization and merging usually consists of an allreduce-style operation. This synchronization makes the effects of any imbalance between data loading and training more pronounced because, if even one worker and GPU become imbalanced, the performance of the entire distributed training will suffer." ] @@ -112,7 +112,7 @@ "from pygments.formatters import HtmlFormatter\n", "from IPython.display import display, HTML\n", "\n", - "sys.path.insert(0, os.path.abspath(\"../dlio_extensions/\"))\n", + "sys.path.insert(0, os.path.abspath(\"dlio_extensions/\"))\n", "\n", "from dyad_torch_data_loader import DYADTorchDataset" ] @@ -226,7 +226,7 @@ "workers_per_node = 1\n", "dyad_install_prefix = \"/usr/local\"\n", "num_nodes = 2\n", - "dlio_extensions_dir = \"/home/jovyan/flux-tutorial-2024/dlio_extensions\"\n", + "dlio_extensions_dir = \"/home/jovyan/supplementary/dyad/dlio_extensions\"\n", "workload = \"dyad_unet3d_demo\"" ] }, @@ -249,9 +249,9 @@ "DYAD_KVS_NAMESPACE={kvs_namespace}\n", "DYAD_DTL_MODE={dtl_mode}\n", "DYAD_PATH={managed_directory}\n", - "LD_LIBRARY_PATH={dyad_install_prefix}/lib\n", + "LD_LIBRARY_PATH={dyad_install_prefix}/lib:$LD_LIBRARY_PATH\n", "PYTHONPATH={dlio_extensions_dir}:$PYTHONPATH\n", - "DLIO_PROFILER_ENABLE=0\n", + "DFTRACER_ENABLE=0\n", "\"\"\"\n", "\n", "with open(\"dlio_env.txt\", \"w\") as f:\n", @@ -378,7 +378,7 @@ "metadata": {}, "outputs": [], "source": [ - "!flux run -N {num_nodes} -o cpu-affinity=on --tasks-per-node={workers_per_node} --env-file=dlio_env.txt \\\n", + "!flux run -N {num_nodes} -o cpu-affinity=off --tasks-per-node={workers_per_node} --env-file=dlio_env.txt \\\n", " dlio_benchmark --config-dir={dlio_extensions_dir}/configs workload={workload} \\\n", " ++workload.dataset.data_folder={initial_data_directory} ++workload.workflow.generate_data=False \\\n", " ++workload.workflow.train=True\n", @@ -465,16 +465,16 @@ "
\n", "\n", "
\n", - "
\n", + "Figure 4: DYAD improves the epoch time of Unet3D by up to 10.82x due to locality-aware caching as compared to UnifyFS.\n", "
\n", "\n", - "Figure X shows the performance of Lustre, [UnifyFS](https://ieeexplore.ieee.org/document/10177390), and DYAD in terms of runtime and I/O bandwidth for the full version of the 3D U-Net training. As explained on the [webpage for the KiTS19 Challenge](https://kits19.grand-challenge.org/), the dataset for the full version of this application consists of 10,240, NPZ-formatted image files, resulting in a total dataset size of 1.36 TB. Within each epoch of PyTorch-based training, the model processes batches of 4 images using 6 I/O processes per GPU. The model trains for 20 epochs without checkpointing. The model scales from 8 to 64 nodes of LLNL's [Corona](https://hpc.llnl.gov/hardware/compute-platforms/corona) supercomputer, with 8 GPUs per node.\n", + "Figure 4 shows the performance of Lustre, [UnifyFS](https://ieeexplore.ieee.org/document/10177390), and DYAD in terms of runtime and I/O bandwidth for the full version of the 3D U-Net training. As explained on the [webpage for the KiTS19 Challenge](https://kits19.grand-challenge.org/), the dataset for the full version of this application consists of 10,240, NPZ-formatted image files, resulting in a total dataset size of 1.36 TB. Within each epoch of PyTorch-based training, the model processes batches of 4 images using 6 I/O processes per GPU. The model trains for 20 epochs without checkpointing. The model scales from 8 to 64 nodes of LLNL's [Corona](https://hpc.llnl.gov/hardware/compute-platforms/corona) supercomputer, with 8 GPUs per node.\n", "\n", - "In the leftmost plot of Figure X, we show the runtime of the training for Lustre, UnifyFS, and DYAD at 8, 16, 32, and 64 nodes. This plot shows that DYAD provides significant runtime improvement compared to Lustre and UnifyFS for the 3D U-Net, mainly due to locality optimizations. DYAD runs up to 7.5 times faster than Lustre and 1.88 times faster than UnifyFS, with less performance variability due to DYAD's use of node-local storage.\n", + "In the leftmost plot of Figure 4, we show the runtime of the training for Lustre, UnifyFS, and DYAD at 8, 16, 32, and 64 nodes. This plot shows that DYAD provides significant runtime improvement compared to Lustre and UnifyFS for the 3D U-Net, mainly due to locality optimizations. DYAD runs up to 7.5 times faster than Lustre and 1.88 times faster than UnifyFS, with less performance variability due to DYAD's use of node-local storage.\n", "\n", - "In the middle plot of Figure X, we show the bandwidth per epoch of training across 512 GPUs (64 nodes). Because DYAD's capabilities allow for on-the-fly caching of data, its performance starts similar to that of Lustre. As more data is cached into DYAD, its bandwidth increases to 140 GB/s due to DYAD's streaming RPC over RDMA protocol. Finally, as even more data is cached, DYAD's bandwidth reaches 1409 GB/s because DYAD's locality-aware caching allows almost all sample reads to be performed directly on node-local NVMe. In comparison, both Lustre and Unify maintain consistent bandwidths well under those of DYAD. By the 20th epoch, DYAD speeds up training by 10.62 times compared to UnifyFS.\n", + "In the middle plot of Figure 4, we show the bandwidth per epoch of training across 512 GPUs (64 nodes). Because DYAD's capabilities allow for on-the-fly caching of data, its performance starts similar to that of Lustre. As more data is cached into DYAD, its bandwidth increases to 140 GB/s due to DYAD's streaming RPC over RDMA protocol. Finally, as even more data is cached, DYAD's bandwidth reaches 1409 GB/s because DYAD's locality-aware caching allows almost all sample reads to be performed directly on node-local NVMe. In comparison, both Lustre and Unify maintain consistent bandwidths well under those of DYAD. By the 20th epoch, DYAD speeds up training by 10.62 times compared to UnifyFS.\n", "\n", - "Finally, in the rightmost plot of Figure X, we show how often DYAD retrieved data from node-local storage versus retrieving data from storage on a remote node in terms of percentage of data access requests. Initially, DYAD mostly performs remote requests. As training continues, more and more data is replicated with DYAD's locality-aware caching, resulting in a larger percentage of local requests. By epoch 13, almost all data is accessed through local requests. This transition from mostly remote requests to mostly local requests corresponds with the increase in bandwidth shown in the middle plot of Figure X." + "Finally, in the rightmost plot of Figure 4, we show how often DYAD retrieved data from node-local storage versus retrieving data from storage on a remote node in terms of the percentage of data access requests. Initially, DYAD mostly performs remote requests. As training continues, more and more data is replicated with DYAD's locality-aware caching, resulting in a larger percentage of local requests. By epoch 13, almost all data is accessed through local requests. This transition from mostly remote requests to mostly local requests corresponds with the increase in bandwidth shown in the middle plot of Figure 4." ] }, { @@ -482,7 +482,7 @@ "id": "81d7d87f-1e09-42c8-b165-8902551f6847", "metadata": {}, "source": [ - "# This concludes Module 3.\n", + "# This concludes Suppliment Module 1.\n", "\n", "In this module, we covered:\n", "1. Design of DYAD\n", @@ -490,8 +490,16 @@ "3. Deep Learning I/O (DLIO) benchmark\n", "4. Accelerating distributed DL training\n", "\n", - "To continue with the tutorial, open [Module 4](./04_flux_tutorial_conclusions.ipynb)" + "" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "37fc415f-7972-4f44-ac1e-f3d1258345be", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -510,7 +518,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.11.7" } }, "nbformat": 4, diff --git a/2024-HPCIC-AWS/JupyterNotebook/tutorial/supplementary/dyad/img/dl-training-io.png b/2024-HPCIC-AWS/JupyterNotebook/tutorial/supplementary/dyad/img/dl-training-io.png new file mode 100755 index 0000000000000000000000000000000000000000..6129d0ef09a6a0f695406d9bdc4277b6b952b990 GIT binary patch literal 36427 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 literal 0 HcmV?d00001