Skip to main content

Dragon

Dragon is a distributed environment for developing high-performance tools, libraries, and applications at scale. This distribution package provides the necessary components to run the Python multiprocessing library using the Dragon implementation which provides greater scaling and performance improvements over the legacy multiprocessing that is currently distributed with Python.

For examples and the actual source code for Dragon, please visit its github repository: https://github.com/DragonHPC/dragon

Installing Dragon

Dragon currently supports python versions 3.11, 3.12 and 3.13. Otherwise, just do a pip install:

pip install dragonhpc

After doing the pip install of the package, you have completed the prerequisites for running Dragon multiprocessing programs.

Dragon is built with manylinux_2_28 support and should function on most Linux distros.

Extra requirements

Beyond its foundational distributed communication architecture, Dragon includes support for AI and scientific workflows as well as monitoring system performance via its telemetry feature. Dependencies for these supported features is not installed by default when you install the dragonhpc package.

Rather, those extra dependencies are defined as optional requirements that you can install as needed. For instance, installing AI workflow dependencies can be done via

pip install dragonhpc[ai]

And telemetry dependencies can be installed via

pip install dragonhpc[telemetry]

If you were interested in installing both sets of those dependencies, a comma separated list will achieve the result:

pip install dragonhpc[ai,telemetry]

To install the dependencies for all the optional features, you can use the all tag:

pip install dragonhpc[all]

For a complete list of the currently supported extra requirement tags, refer to extra-requirements.txt in the open source repository.

Configuring Dragon's high performance network backend for HSTA

Dragon includes two separate network backend services for communication across compute nodes. The first is referred as the "TCP transport agent". This backend uses common TCP to perform any communication over the compute network. However, this backend is relatively low performing and can be a performance bottleneck.

Dragon also includes the "High Speed Transport Agent (HSTA)", which supports UCX for Infiniband networks and OpenFabrics Interface (OFI) for HPE Slingshot. However, Dragon can only use these networks if its environment is properly configured.

To configure HSTA, use dragon-config to provide an "ofi-runtime-lib" or "ucx-runtime-lib". The input should be a library path that contains a libfabric.so for OFI or a libucp.so for UCX. These are libraries are dynamically opened by HSTA at runtime. Without them, dragon will fallback to using the lower performing TCP transport agent

Example configuration commands appear below:

# For a UCX backend, provide a library path that contains a libucp.so:
dragon-config add --ucx-runtime-lib=/opt/nvidia/hpc_sdk/Linux_x86_64/23.11/comm_libs/12.3/hpcx/hpcx-2.16/ucx/prof/lib

# For an OFI backend, provide a library path that contains a libfabric.so:
dragon-config add --ofi-runtime-lib=/opt/cray/libfabric/1.22.0/lib64

As mentioned, if dragon-config is not run as above to tell Dragon where to appropriate libraries exist, Dragon will fall back to using the TCP transport agent. You'll know this because a message similar to the following will print to stdout:

Dragon was unable to find a high-speed network backend configuration.
Please refer to `dragon-config --help`, DragonHPC documentation, and README.md
to determine the best way to configure the high-speed network backend to your
compute environment (e.g., ofi or ucx). In the meantime, we will use the
lower performing TCP transport agent for backend network communication.

If you get tired of seeing this message and plan to only use TCP communication over ethernet, you can use the following dragon-config command to silence it:

dragon-config add --tcp-runtime=True

For help without referring to this README.md, you can always use dragon-config --help

Running a Program using Dragon and python multiprocessing

There are two steps that users must take to use Dragon multiprocessing.

  1. You must import the dragon module in your source code and set dragon as the start method, much as you would set the start method for spawn or fork.

     import dragon
     import multiprocessing as mp
     ...
     if __name__ == "__main__":
         # set the start method prior to using any multiprocessing methods
         mp.set_start_method('dragon')
         ...
    

    This must be done for once for each application. Dragon is an API level replacement for multiprocessing. So, to learn more about Dragon and what it can do, read up on multiprocessing.

  2. You must start your program using the dragon command. This not only starts your program, but it also starts the Dragon run-time services that provide the necessary infrastructure for running multiprocessing at scale.

     dragon myprog.py
    

    If you want to run across multiple nodes, simply obtain an allocation through Slurm (or PBS) and then run dragon.

     salloc --nodes=2 --exclusive
     dragon myprog.py
    

If you find that there are directions that would be helpful and are missing from our documentation, please make note of them and provide us with feedback. This is an early stab at documentation. We'd like to hear from you. Have fun with Dragon!

Sanity check Dragon installation

Grab the following from the DragonHPC github by cloning the repository or a quick wget: p2p_lat.py

wget https://raw.githubusercontent.com/DragonHPC/dragon/refs/heads/main/examples/multiprocessing/p2p_lat.py .

If testing on a single compute node/instance, you can just do:

dragon p2p_lat.py --dragon
using Dragon
Msglen [B]   Lat [usec]
2  28.75431440770626
4  39.88605458289385
8  37.25141752511263
16  43.31085830926895
+++ head proc exited, code 0

If you're trying to test the same across two nodes connected via a high speed network, try to get an allocation via the workload manager first and then run the test, eg:

salloc --nodes=2 --exclusive
dragon p2p_lat.py --dragon
using Dragon
Msglen [B]   Lat [usec]
2  73.80113238468765
4  73.75898555619642
8  73.52533907396719
16  72.79851596103981

Environment Variables

DRAGON_DEBUG - Set to any non-empty string to enable more verbose logging

DRAGON_DEFAULT_SEG_SZ - Set to the number of bytes for the default Managed Memory Pool. The default size is 4294967296 (4 GB). This may need to be increased for applications running with a lot of Queues or Pipes, for example.

Requirements

  • Python >= 3.10
  • GCC 9 or later
  • Slurm or PBS+PALS (for multi-node Dragon)

NOTE: The DragonHPC project is planning to discontinue packaged releases targeting Python 3.10 as Python 3.10 approaches its official end-of-life in October 2026. Consequently, future updates will prioritize more recent Python releases to ensure continued security and compatibility.

Known Issues

For any issues you encounter, it is recommended that you run with a higher level of debug output. It is often possible to find the root cause of the problem in the output from the runtime. We also ask for any issues you wish to report that this output be included in the report. To learn more about how to enable higher levels of debug logging refer to dragon --help.

Dragon Managed Memory, a low level component of the Dragon runtime, uses shared memory. It is possible that things go wrong while the runtime is coming down and files are left in /dev/shm. Dragon does attempt to clean these up in the chance of a bad exit, but it may not succeed. In that case, running dragon-cleanup on your own will clean up any zombie processes or un-freed memory.

It is possible for a user application or workflow to exhaust memory resources in Dragon Managed Memory without the runtime detecting it. Many allocation paths in the runtime use "blocking" allocations that include a timeout, but not all paths do this if the multiprocessing API in question doesn't have timeout semantics on an operation. When this happens, you may observe what appears to be a hang. If this happens, try increasing the value of the DRAGON_DEFAULT_SEG_SZ environment variable to larger sizes (default is 4 GB, try increasing to 16 or 32 GB). Note this variable takes the number of bytes.

Python multiprocessing applications that switch between start methods may fail with this due to how Queue is being patched in. The issue will be addressed in a later update.

If there is a firewall blocking port 7575 between compute nodes, dragon will hang. You will need to specify a different port that is not blocked through the --port option to dragon. Additionally, if you specify --network-prefix and Dragon fails to find a match the runtime will hang during startup. Proper error handling of this case will come in a later release.

In the event your experiment goes awry, we provide a helper script, dragon-cleanup, to clean up any zombie processes and memory.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

dragonhpc-0.14.1-cp313-cp313-manylinux_2_28_x86_64.whl (14.8 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

dragonhpc-0.14.1-cp313-cp313-manylinux_2_28_aarch64.whl (14.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

dragonhpc-0.14.1-cp313-cp313-macosx_26_0_arm64.whl (5.2 MB view details)

Uploaded CPython 3.13macOS 26.0+ ARM64

dragonhpc-0.14.1-cp312-cp312-manylinux_2_28_x86_64.whl (14.8 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

dragonhpc-0.14.1-cp312-cp312-manylinux_2_28_aarch64.whl (14.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

dragonhpc-0.14.1-cp312-cp312-macosx_26_0_arm64.whl (5.2 MB view details)

Uploaded CPython 3.12macOS 26.0+ ARM64

dragonhpc-0.14.1-cp311-cp311-manylinux_2_28_x86_64.whl (15.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

dragonhpc-0.14.1-cp311-cp311-manylinux_2_28_aarch64.whl (14.7 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ ARM64

dragonhpc-0.14.1-cp311-cp311-macosx_26_0_arm64.whl (5.2 MB view details)

Uploaded CPython 3.11macOS 26.0+ ARM64

File details

Details for the file dragonhpc-0.14.1-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dragonhpc-0.14.1-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 078d4f11acc771fcb13391936512b5671c27c5b0c4a8d48fcd2090ba051b699b
MD5 46ecd9551dfd701bdf66dc535d3f0547
BLAKE2b-256 b626f5fb8438c51fd33b5c5ed2c841596eb0c49d108a72ea43b890fe1c08df1e

See more details on using hashes here.

File details

Details for the file dragonhpc-0.14.1-cp313-cp313-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for dragonhpc-0.14.1-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 1dfe0688f0ced49d1b5578b1ce8ca95f8b45db60f5423a24ea938400d6dd6cd8
MD5 bd732d83cb1ccc7d4f43f2f91d6f3fdd
BLAKE2b-256 3fe45c5b755314a7f9aedede36e92b283700720fc0595531d7f9afd3bec57171

See more details on using hashes here.

File details

Details for the file dragonhpc-0.14.1-cp313-cp313-macosx_26_0_arm64.whl.

File metadata

File hashes

Hashes for dragonhpc-0.14.1-cp313-cp313-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 23bb45b4d382df7492739cd63026d8c4fd3d9db57e7aa6e33cda7de9f87ab316
MD5 58fe95660e3732fa229278ad5064ce93
BLAKE2b-256 87f7fa082865184784ebe11342d5d308645f97e548c81dece932f64c5ccad6ef

See more details on using hashes here.

File details

Details for the file dragonhpc-0.14.1-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dragonhpc-0.14.1-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 57052a7483617585f74a4ef54332eb5f9f0f12febfa19d13bffe7fe58add4c40
MD5 9116674fda7123b35be3250e39bb6727
BLAKE2b-256 4f573540fbf0c9c5535a3dc193678b8cfd2ca3534de75c0310b35bcf6dd0cc29

See more details on using hashes here.

File details

Details for the file dragonhpc-0.14.1-cp312-cp312-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for dragonhpc-0.14.1-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 40b6741593012e3da07fff4133b2d48629635e5ed6f423f5b7df9716e6d0e103
MD5 996add8b5022431196dbc6a88ecc94bb
BLAKE2b-256 f4cb8247e046c0698605e9f13ee9fbd47b419b57b34099632ec084df4246ab26

See more details on using hashes here.

File details

Details for the file dragonhpc-0.14.1-cp312-cp312-macosx_26_0_arm64.whl.

File metadata

File hashes

Hashes for dragonhpc-0.14.1-cp312-cp312-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 746265e3f3ce666c20f53dfe3cdfa5331b100c35a76532cc803171937ac1dc15
MD5 2445165f1b6cbcb566d818a2b87e2c66
BLAKE2b-256 6b1d695d846106362bfdae02771a6cc3d825189487a6a7e9f36c101349957f81

See more details on using hashes here.

File details

Details for the file dragonhpc-0.14.1-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dragonhpc-0.14.1-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3c00fd8a8b9962032fad94a70e1ddbd16b6f26c354d3b7135bb56b54645a913f
MD5 64586e6c1a3734f4763182e1731f085f
BLAKE2b-256 26646453f1a8124017afe45e0e593d3358639b792e2c392a09e6ecda9b4cef94

See more details on using hashes here.

File details

Details for the file dragonhpc-0.14.1-cp311-cp311-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for dragonhpc-0.14.1-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 fbed1a73187e17944c246c36ce056879a1f963dac7ee902c4b2894591965cec8
MD5 63225839a74c8719f8488f1cf85a0abd
BLAKE2b-256 30f6ef4b2c00df775c6b0f2bd46a2d641dc61cb9168b47eb06247f2b4d33351b

See more details on using hashes here.

File details

Details for the file dragonhpc-0.14.1-cp311-cp311-macosx_26_0_arm64.whl.

File metadata

File hashes

Hashes for dragonhpc-0.14.1-cp311-cp311-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 0883b3ebff3e36cb7206be95f42624770c3580a9cb30f49989946f6d27a91d54
MD5 ec76ed3e3542f3737e7c3ed33b862bfe
BLAKE2b-256 c6cf72e5216bf10769290feb05668cf2012f885b4e7e18dcff6abb34dc78a89b

See more details on using hashes here.

Release history Release notifications | RSS feed

0.14.2

9 files

0.14.1.1

3 files

This release

0.14.1 This release

9 files

0.14.0

4 files

0.13.2

3 files

0.13.1

3 files

0.13

3 files

0.12.3

3 files

0.12.2

3 files

0.12.1

3 files

0.12.0

3 files

0.11.1

3 files

0.11

3 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page