-
+
- DYAD: DYnamic and Asynchronous Data Streamliner
-
+ ** DYAD: DYnamic and Asynchronous Data Streamliner **
-
+
---
diff --git a/docs/_fragments/design_overview.rst b/docs/_fragments/design_overview.rst
index 7c64dd38..51edaf02 100644
--- a/docs/_fragments/design_overview.rst
+++ b/docs/_fragments/design_overview.rst
@@ -9,12 +9,12 @@ Overview of Synchronization and File Transfer
DYAD consists of two components: a :ref:`**wrapper**` library that is injected
into the application process via ``LD_PRELOAD`` or C++ stream wrapper
-classes to transparently intercept I/O calls, and a :ref:`**service**` that
+classes to transparently intercept I/O calls, and a :ref:`**service**` that
runs as a plugin module to the Flux broker on each node. Together they
coordinate file access and transfer between nodes.
The wrapper intercepts I/O only for files in the directory it manages,
-or :ref:`DYAD managed directory (DMD)`. If the file shared between producer and
+or :ref:`DYAD managed directory (DMD)`. If the file shared between producer and
consumer under DMD resides on the producer's local storage that is not
visible to the consumer, DYAD both synchronizes accesses and transfers
files to the DMD on the consumer's local storage. If it is visible to
@@ -52,7 +52,7 @@ occur in order (see **c.1–c.3** in the diagram):
query when it sees the matching entry, which propagates from the
producer's local HFL through the hierarchy.
2. **c.2** ``rpc_get(producer_rank, filename)`` — the wrapper sends an
- RPC to the producer's :ref:`DYAD service` requesting the file. The service
+ RPC to the producer's :ref:`DYAD service` requesting the file. The service
transfers the file over the selected :ref:`DTL backend` (Flux RPC, Margo, or
UCX) and stores it on the consumer's local storage.
3. **c.3** ``read(managed_dir/filename)`` — the application reads the
diff --git a/docs/_static/figs/dyad_without_vs_with.svg b/docs/_static/figs/dyad_without_vs_with.svg
index acc49ae2..fc4c35ab 100644
--- a/docs/_static/figs/dyad_without_vs_with.svg
+++ b/docs/_static/figs/dyad_without_vs_with.svg
@@ -1,11 +1,13 @@
+ showgrid="false"
+ inkscape:clip-to-page="false" />
@@ -41,7 +44,7 @@
refY="3"
orient="auto">
@@ -54,8 +57,8 @@
refY="3"
orient="auto">
@@ -64,75 +67,75 @@
height="387.66046"
fill="#ffffff"
id="rect2"
- x="105.53488"
- y="161.39536"
+ x="0"
+ y="0"
style="stroke-width:0.685529" />
Without DYADexplicit sync(dependent jobs, API, or polling)P1P2ProducerWRConsumerShared FSSharedFS: from bottom-center of W (347.6,333.5) to top of FS (379.5,437.6) -->
/lustre/${USER}/file.txtWith DYADP1P2ProducerWRConsumerLocal StorageLocal Storage/ssd/${USER} /file.txt/ssd/${USER}/file.txtI/O intercepting wrapper lib
+ id="text30">I/O intercepting wrapper
relying on KVS + RPC
+ id="text31">lib relying on KVS + RPC
diff --git a/docs/_static/img_width.css b/docs/_static/img_width.css
new file mode 100644
index 00000000..7d40e4c4
--- /dev/null
+++ b/docs/_static/img_width.css
@@ -0,0 +1,31 @@
+#dyad-without-vs-with a.reference {
+ display: block !important;
+}
+
+#dyad-without-vs-with img {
+ width: 100% !important;
+ max-width: 100% !important;
+}
+
+#dyad-without-vs-with.align-default {
+ margin-left: 0 !important;
+ margin-right: 0 !important;
+ width: 100% !important;
+}
+
+#dyad-without-vs-with figcaption {
+ text-align: left !important;
+}
+
+#dyad-without-vs-with {
+ width: 100% !important;
+}
+
+#dyad-without-vs-with img {
+ width: 100% !important;
+ max-width: 100% !important;
+}
+
+#dyad-without-vs-with figcaption {
+ text-align: left !important;
+}
diff --git a/docs/_templates/search.html b/docs/_templates/search.html
new file mode 100644
index 00000000..fbbbf946
--- /dev/null
+++ b/docs/_templates/search.html
@@ -0,0 +1,37 @@
+{%- extends "!search.html" %}
+{% block body %}
+
{{ _('Search') }}
+
+
+ {% if search_performed %}
+
{{ _('Search Results') }}
+ {% if not search_results %}
+
{{ _('Your search did not match any documents.') }}
+ {% endif %}
+ {% endif %}
+
+ {% if search_results %}
+
+ {% for href, caption, context in search_results %}
+
+{% endblock %}
diff --git a/docs/conf.py b/docs/conf.py
index febffaee..c61fab27 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -28,6 +28,7 @@
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
+ "sphinx_rtd_theme",
"sphinx.ext.autosectionlabel",
'myst_parser',
]
@@ -56,6 +57,8 @@
raw_enabled = True
html_allow_unsafe = True
+autosectionlabel_prefix_document = True
+suppress_warnings = ["autosectionlabel.*"]
# -- Options for HTML output -------------------------------------------------
@@ -69,7 +72,8 @@
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
html_logo = "_static/logo/dyad_logo_white_streamliner.svg"
-html_css_files = ["logo/logo.css"]
+html_css_files = ["logo/logo.css", "img_width.css"]
+
# -- Options for Breathe ---------------------------------------------------
diff --git a/docs/design.rst b/docs/design.rst
index c26a44ee..a59009de 100644
--- a/docs/design.rst
+++ b/docs/design.rst
@@ -14,6 +14,8 @@ A producer and consumer scenario sharing a file
.. figure:: _static/figs/dyad_without_vs_with.svg
:alt: Without DYAD vs With DYAD
+ :name: dyad-without-vs-with
+ :align: center
Without DYAD, producer and consumer share data via a shared file system
(e.g., Lustre) with explicit synchronization through dependent jobs, APIs,
@@ -23,8 +25,7 @@ A producer and consumer scenario sharing a file
RDMA-based data movement, eliminating both the shared file system
bottleneck and the need for explicit synchronization.
- Check out our use case with a molecular dynamics simulation workflow
- :ref:`Lumsden et al. 2024 `.
+ Check out our use case with a molecular dynamics simulation workflow :ref:`Lumsden et al. 2024 `.
Deep Learning Training by Distributed Stochastic Gradient Descent (SGD)
=======================================================================
diff --git a/docs/getting_started.rst b/docs/getting_started.rst
index c00fb0dd..8953c86d 100644
--- a/docs/getting_started.rst
+++ b/docs/getting_started.rst
@@ -362,10 +362,12 @@ Running DYAD
There are three steps to running DYAD-enabled applications:
-1. :ref:`Create a Flux key-value store (KVS) namespace `
-2. :ref:`Determine the managed directories for each application `
-3. :ref:`Load DYAD's Flux module `
-4. :ref:`Configure and run the DYAD-enabled applications `
+1. :ref:`Create a Flux key-value store (KVS) namespace `
+2. :ref:`Determine the managed directories for each application `
+3. :ref:`Load DYAD's Flux module `
+4. :ref:`Configure and run the DYAD-enabled applications `
+
+.. _DYAD_Flux_KVS_NS:
Create a Flux KVS Namespace
***************************
@@ -384,7 +386,7 @@ consumer. To create this namespace, run the following:
The namespace can be whatever string value you want.
-.. _dyad_managed_dir:
+.. _DYAD_managed_dir:
Determine the Managed Directories for Each Application
******************************************************
@@ -416,7 +418,7 @@ for each application. These directories will need to be provided to the commands
files in the managed directories.
-.. _dyad_user_service:
+.. _DYAD_user_service:
Load DYAD's Flux Module
***********************
@@ -443,6 +445,9 @@ do this by running:
$ flux exec -r all flux module load path/to/dyad.so
+
+.. _DYAD_enabling_apps:
+
Configure and Run the DYAD-Enabled Applications
***********************************************
diff --git a/docs/index.rst b/docs/index.rst
index 7139ad9f..3542b686 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -84,10 +84,16 @@ In resolving these challenges, DYAD aims to provide the following to users:
dyad_logos
+.. toctree::
+ :hidden:
+ :caption: Indices
+
+ genindex
+ search
+
Indices and tables
==================
* :ref:`genindex`
-* :ref:`modindex`
* :ref:`search`