From c42bf8bb5bfe6ab968bcc7dc8f043d69ce6c82cf Mon Sep 17 00:00:00 2001 From: Repo Updater <noreply@mpcdf.mpg.de> Date: Thu, 17 Nov 2022 08:39:18 +0100 Subject: [PATCH] 82f97415 some polishing of the first part of parallel --- ...--Parallel_Programming_Shared_Memory.ipynb | 14 +- notebooks/4b--Parallel_Frameworks.ipynb | 27 +- notebooks/fig/dask-array.svg | 349 ++++++++++++++++++ 3 files changed, 375 insertions(+), 15 deletions(-) create mode 100644 notebooks/fig/dask-array.svg diff --git a/notebooks/4a--Parallel_Programming_Shared_Memory.ipynb b/notebooks/4a--Parallel_Programming_Shared_Memory.ipynb index d8d2fdc..ab82f36 100644 --- a/notebooks/4a--Parallel_Programming_Shared_Memory.ipynb +++ b/notebooks/4a--Parallel_Programming_Shared_Memory.ipynb @@ -258,11 +258,10 @@ "* Processes (shared memory)\n", " * `multiprocessing`, comparably easy to use\n", " * restricted to one node\n", - "* MPI (distributed memory)\n", + "* MPI or parallel frameworks (distributed memory)\n", " * `mpi4py`\n", " * more complex\n", - " * can be used over a cluster\n", - " * separate lecture" + " * can be used over a cluster" ] }, { @@ -318,7 +317,9 @@ "* Idea: Start several processes on one node to distribute the workload over CPUs\n", "* Use processes instead of threads $\\to$ sidestep the global interpreter lock\n", "* `multiprocessing` module, part of the Python standard library\n", - "* Most important use case: Data parallelism with the `Pool` class" + "* Most important use case: Data parallelism with the `Pool` class\n", + "* Explicit interprocess communication possible via Queues\n", + "* https://docs.python.org/3/library/multiprocessing.html" ] }, { @@ -461,9 +462,10 @@ "### Asynchronous parallel computing via `concurrent.futures`\n", "\n", "* `concurrent.futures` enables the *asynchronous* execution of tasks\n", - "* useful with `ProcessPoolExecutor` which actually builds upon `multiprocessing`\n", + "* useful with `ProcessPoolExecutor()` which actually builds upon `multiprocessing`\n", "* `map` offloads tasks to the worker Pool and returns an iterator that is order-preserving\n", - "* 'futures' are tasks that are offloaded via `submit()`, `as_completed` provides an iterator in completion-order" + "* 'futures' are tasks that are offloaded via `submit()`, `as_completed` provides an iterator in completion-order\n", + "* https://docs.python.org/3/library/concurrent.futures.html" ] }, { diff --git a/notebooks/4b--Parallel_Frameworks.ipynb b/notebooks/4b--Parallel_Frameworks.ipynb index fc37ee6..84b37c0 100644 --- a/notebooks/4b--Parallel_Frameworks.ipynb +++ b/notebooks/4b--Parallel_Frameworks.ipynb @@ -27,7 +27,7 @@ "* Motivation\n", "* Overview on Parallel Frameworks\n", "* Example: Dask\n", - " * Concepts\n", + " * Basic concepts\n", " * Dask-MPI on a Slurm cluster" ] }, @@ -82,7 +82,7 @@ " * not designed to run web services (e.g. dashboards, scheduler services)\n", " * workloads are submitted via batch jobs\n", " * non-interactive use highly preferred\n", - " * limited support by Python frameworks for parallel computing (exception: Dask), often workarounds needed" + " * sometimes workarounds are needed to get Python frameworks for parallel computing to run (exception: Dask-MPI)" ] }, { @@ -98,13 +98,14 @@ "* Dask is a library for parallel distributed computing in Python\n", "* Components\n", " * resource abstraction called Cluster (a potentially distributed scalable pool of workers), e.g.\n", - " * LocalCluster()\n", - " * SSHCluster()\n", - " * MPI-based cluster\n", + " * LocalCluster() : default, workers on local machine\n", + " * SSHCluster() : workers on remote machines accessible via SSH\n", + " * KubeCluster() : workers on pods running in a Kubernetes cluster\n", + " * MPI-based cluster : workers running as MPI tasks on an HPC system\n", " * dynamic task scheduler\n", " * parallel collections such as arrays and dataframes\n", "\n", - "\n", + "\n", "(image credit: dask documentation)" ] }, @@ -120,7 +121,11 @@ "\n", "* *Dask Array* implements a subset of the NumPy ndarray interface using blocked algorithms\n", "* it cuts up the large array into many small arrays for parallel distributed processing\n", - "* Dask blocked algorithms are coordinated using Dask graphs" + "* Dask blocked algorithms are mapped to tasks and coordinated using Dask graphs\n", + "* not limited to native NumPy, supports generic ndarray-like implementations (CuPy, H5PY)\n", + "\n", + "\n", + "(image credit: dask documentation)" ] }, { @@ -626,7 +631,7 @@ "\n", "* eager evaluation of custom functions via the Dask workers\n", "* Dask futures implements most of `concurrent.futures` for distributed processing\n", - " * `Client.map()` $\\to$ returns an iterator containing the return values of the map'ped function\n", + " * `Client.map()` $\\to$ returns an iterator on the return values of the map'ped function\n", " * `Client.submit()` $\\to$ return value must be fetched using the (blocking) `result()` call of the futures object\n", "* futures (i.e. function and its arguments) are sent as tasks to remote workers for processing, the Dask scheduler takes care of building and updating the dependency graph" ] @@ -634,7 +639,11 @@ { "cell_type": "code", "execution_count": 25, - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, "outputs": [ { "name": "stdout", diff --git a/notebooks/fig/dask-array.svg b/notebooks/fig/dask-array.svg new file mode 100644 index 0000000..bdf33c0 --- /dev/null +++ b/notebooks/fig/dask-array.svg @@ -0,0 +1,349 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + width="1470.853" + height="699.61102" + viewBox="0 0 1470.853 699.61102" + fill="none" + version="1.1" + id="svg4936" + sodipodi:docname="dask-array.svg" + inkscape:version="1.1.1 (c3084ef, 2021-09-22)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs4940" /> + <sodipodi:namedview + id="namedview4938" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:zoom="0.5787037" + inkscape:cx="775.872" + inkscape:cy="360.288" + inkscape:window-width="2179" + inkscape:window-height="969" + inkscape:window-x="103" + inkscape:window-y="248" + inkscape:window-maximized="0" + inkscape:current-layer="svg4936" /> + <g + id="g4999" + transform="translate(-247.547,-190.194)"> + <rect + x="249.547" + y="192.194" + width="314.95001" + height="136.308" + rx="8" + fill="#fff7e7" + stroke="#fe6939" + stroke-width="4" + id="rect4866" /> + <rect + x="588.44501" + y="192.194" + width="100.601" + height="136.308" + rx="8" + fill="#fff7e7" + stroke="#fe6939" + stroke-width="4" + id="rect4868" /> + <rect + x="712.995" + y="192.194" + width="124.878" + height="136.308" + rx="8" + fill="#fff7e7" + stroke="#fe6939" + stroke-width="4" + id="rect4870" /> + <rect + x="861.823" + y="192.194" + width="178.935" + height="136.308" + rx="8" + fill="#fff7e7" + stroke="#fe6939" + stroke-width="4" + id="rect4872" /> + <rect + x="1064.71" + y="192.194" + width="157.18401" + height="136.308" + rx="8" + fill="#fff7e7" + stroke="#fe6939" + stroke-width="4" + id="rect4874" /> + <rect + x="249.547" + y="565.37903" + width="314.95001" + height="136.308" + rx="8" + fill="#fff7e7" + stroke="#fe6939" + stroke-width="4" + id="rect4876" /> + <rect + x="588.44501" + y="565.37903" + width="100.601" + height="136.308" + rx="8" + fill="#fff7e7" + stroke="#fe6939" + stroke-width="4" + id="rect4878" /> + <rect + x="712.995" + y="565.37903" + width="124.878" + height="136.308" + rx="8" + fill="#fff7e7" + stroke="#fe6939" + stroke-width="4" + id="rect4880" /> + <rect + x="861.823" + y="565.37903" + width="178.935" + height="136.308" + rx="8" + fill="#fff7e7" + stroke="#fe6939" + stroke-width="4" + id="rect4882" /> + <rect + x="1064.71" + y="565.37903" + width="157.18401" + height="136.308" + rx="8" + fill="#fff7e7" + stroke="#fe6939" + stroke-width="4" + id="rect4884" /> + <rect + x="249.547" + y="351.121" + width="314.95001" + height="191.63901" + rx="8" + fill="#fff7e7" + stroke="#fe6939" + stroke-width="4" + id="rect4886" /> + <rect + x="588.44501" + y="351.121" + width="100.601" + height="191.63901" + rx="8" + fill="#fff7e7" + stroke="#fe6939" + stroke-width="4" + id="rect4888" /> + <rect + x="712.995" + y="351.121" + width="124.878" + height="191.63901" + rx="8" + fill="#fff7e7" + stroke="#fe6939" + stroke-width="4" + id="rect4890" /> + <rect + x="861.823" + y="351.121" + width="178.935" + height="191.63901" + rx="8" + fill="#fff7e7" + stroke="#fe6939" + stroke-width="4" + id="rect4892" /> + <rect + x="1064.71" + y="351.121" + width="157.18401" + height="191.63901" + rx="8" + fill="#fdd3a6" + stroke="#fe6939" + stroke-width="4" + id="rect4894" /> + <rect + x="249.547" + y="724.30603" + width="314.95001" + height="163.49899" + rx="8" + fill="#fff7e7" + stroke="#fe6939" + stroke-width="4" + id="rect4896" /> + <rect + x="588.44501" + y="724.30603" + width="100.601" + height="163.49899" + rx="8" + fill="#fff7e7" + stroke="#fe6939" + stroke-width="4" + id="rect4898" /> + <rect + x="712.995" + y="724.30603" + width="124.878" + height="163.49899" + rx="8" + fill="#fff7e7" + stroke="#fe6939" + stroke-width="4" + id="rect4900" /> + <rect + x="861.823" + y="724.30603" + width="178.935" + height="163.49899" + rx="8" + fill="#fff7e7" + stroke="#fe6939" + stroke-width="4" + id="rect4902" /> + <rect + x="1064.71" + y="724.30603" + width="157.18401" + height="163.49899" + rx="8" + fill="#fff7e7" + stroke="#fe6939" + stroke-width="4" + id="rect4904" /> + <line + x1="1089.63" + y1="351.866" + x2="1089.63" + y2="544.76001" + stroke="#fe6939" + stroke-width="4" + id="line4906" /> + <line + x1="1116.36" + y1="351.866" + x2="1116.36" + y2="544.76001" + stroke="#fe6939" + stroke-width="4" + id="line4908" /> + <line + x1="1143.08" + y1="351.866" + x2="1143.08" + y2="544.76001" + stroke="#fe6939" + stroke-width="4" + id="line4910" /> + <line + x1="1169.8101" + y1="351.866" + x2="1169.8101" + y2="544.76001" + stroke="#fe6939" + stroke-width="4" + id="line4912" /> + <line + x1="1196.54" + y1="351.866" + x2="1196.54" + y2="544.76001" + stroke="#fe6939" + stroke-width="4" + id="line4914" /> + <line + x1="1223.89" + y1="389.10101" + x2="1062.71" + y2="389.10101" + stroke="#fe6939" + stroke-width="4" + id="line4916" /> + <line + x1="1223.89" + y1="427.54501" + x2="1062.71" + y2="427.54501" + stroke="#fe6939" + stroke-width="4" + id="line4918" /> + <line + x1="1223.89" + y1="465.98801" + x2="1062.71" + y2="465.98801" + stroke="#fe6939" + stroke-width="4" + id="line4920" /> + <line + x1="1223.89" + y1="504.431" + x2="1062.71" + y2="504.431" + stroke="#fe6939" + stroke-width="4" + id="line4922" /> + <path + d="m 1353.74,433.431 h -6.18 l -15.84,-25.219 v 25.219 h -6.18 v -35.547 h 6.18 l 15.89,25.318 v -25.318 h 6.13 z m 22.73,-2.588 c -1.74,2.051 -4.21,3.077 -7.42,3.077 -2.87,0 -5.04,-0.839 -6.52,-2.515 -1.46,-1.677 -2.2,-4.102 -2.2,-7.275 v -17.115 h 5.94 v 17.041 c 0,3.353 1.39,5.03 4.17,5.03 2.88,0 4.83,-1.034 5.84,-3.101 v -18.97 h 5.93 v 26.416 h -5.59 z m 17.36,-23.828 0.17,2.759 c 1.86,-2.165 4.39,-3.247 7.62,-3.247 3.53,0 5.95,1.351 7.25,4.053 1.92,-2.702 4.62,-4.053 8.1,-4.053 2.92,0 5.08,0.806 6.5,2.417 1.43,1.611 2.16,3.988 2.2,7.129 v 17.358 h -5.94 v -17.187 c 0,-1.677 -0.36,-2.905 -1.1,-3.687 -0.73,-0.781 -1.94,-1.172 -3.63,-1.172 -1.35,0 -2.46,0.367 -3.32,1.099 -0.85,0.716 -1.44,1.66 -1.79,2.832 l 0.03,18.115 h -5.93 v -17.383 c -0.09,-3.108 -1.67,-4.663 -4.77,-4.663 -2.37,0 -4.06,0.969 -5.05,2.906 v 19.14 h -5.93 v -26.416 z m 44.68,13.208 v 13.208 h -6.18 v -35.547 h 13.6 c 3.97,0 7.12,1.034 9.45,3.101 2.34,2.067 3.51,4.801 3.51,8.203 0,3.483 -1.14,6.193 -3.44,8.13 -2.28,1.937 -5.48,2.905 -9.59,2.905 z m 0,-4.956 h 7.42 c 2.2,0 3.87,-0.512 5.03,-1.538 1.15,-1.042 1.73,-2.539 1.73,-4.492 0,-1.921 -0.58,-3.451 -1.76,-4.59 -1.17,-1.156 -2.78,-1.75 -4.83,-1.782 h -7.59 z m 34.86,9.668 5.37,-17.92 h 6.32 l -10.49,30.42 c -1.61,4.444 -4.35,6.665 -8.21,6.665 -0.86,0 -1.81,-0.146 -2.85,-0.439 v -4.59 l 1.12,0.073 c 1.5,0 2.62,-0.277 3.37,-0.83 0.76,-0.537 1.37,-1.448 1.81,-2.734 l 0.85,-2.271 -9.28,-26.294 h 6.4 z m -105.54,59.22 h -13.77 l -2.88,8.276 h -6.42 l 13.42,-35.547 h 5.55 l 13.45,35.547 h -6.45 z m -12.04,-4.981 h 10.3 l -5.15,-14.746 z m 38.7,-7.739 c -0.78,-0.13 -1.59,-0.195 -2.42,-0.195 -2.72,0 -4.55,1.042 -5.49,3.125 v 18.066 h -5.93 v -26.416 h 5.66 l 0.15,2.954 c 1.43,-2.295 3.41,-3.442 5.95,-3.442 0.85,0 1.55,0.114 2.1,0.342 z m 17.58,0 c -0.78,-0.13 -1.59,-0.195 -2.42,-0.195 -2.72,0 -4.55,1.042 -5.49,3.125 v 18.066 h -5.94 v -26.416 h 5.67 l 0.14,2.954 c 1.44,-2.295 3.42,-3.442 5.96,-3.442 0.85,0 1.55,0.114 2.1,0.342 z m 18.8,20.996 c -0.27,-0.504 -0.49,-1.326 -0.69,-2.466 -1.89,1.97 -4.2,2.955 -6.93,2.955 -2.65,0 -4.82,-0.757 -6.5,-2.271 -1.67,-1.514 -2.51,-3.385 -2.51,-5.615 0,-2.816 1.04,-4.973 3.12,-6.47 2.1,-1.514 5.1,-2.27 8.99,-2.27 h 3.64 v -1.734 c 0,-1.367 -0.39,-2.458 -1.15,-3.271 -0.77,-0.83 -1.93,-1.245 -3.49,-1.245 -1.35,0 -2.46,0.341 -3.32,1.025 -0.87,0.667 -1.3,1.522 -1.3,2.563 h -5.93 c 0,-1.448 0.48,-2.799 1.44,-4.052 0.96,-1.27 2.26,-2.263 3.91,-2.979 1.66,-0.716 3.51,-1.074 5.54,-1.074 3.09,0 5.56,0.781 7.4,2.344 1.84,1.546 2.78,3.727 2.83,6.543 v 11.914 c 0,2.376 0.33,4.272 1,5.688 v 0.415 z m -6.52,-4.272 c 1.17,0 2.27,-0.285 3.29,-0.855 1.04,-0.569 1.83,-1.334 2.35,-2.295 v -4.98 h -3.2 c -2.2,0 -3.85,0.382 -4.96,1.147 -1.1,0.765 -1.66,1.848 -1.66,3.247 0,1.14 0.38,2.051 1.13,2.735 0.76,0.667 1.78,1.001 3.05,1.001 z m 26.63,-4.224 5.37,-17.92 h 6.33 l -10.5,30.42 c -1.61,4.444 -4.35,6.665 -8.2,6.665 -0.87,0 -1.82,-0.146 -2.86,-0.439 v -4.59 l 1.12,0.073 c 1.5,0 2.62,-0.277 3.37,-0.83 0.77,-0.537 1.37,-1.448 1.81,-2.734 l 0.85,-2.271 -9.27,-26.294 h 6.39 z" + fill="#1d1d1d" + id="path4924" /> + <path + d="m 1607.19,568.26 v -35.547 h 10.5 c 3.14,0 5.92,0.7 8.35,2.1 2.44,1.399 4.33,3.385 5.66,5.957 1.34,2.571 2,5.517 2,8.838 v 1.782 c 0,3.369 -0.67,6.331 -2.02,8.887 -1.34,2.555 -3.25,4.524 -5.74,5.908 -2.47,1.383 -5.31,2.075 -8.52,2.075 z m 6.18,-30.566 v 25.634 h 4.03 c 3.24,0 5.72,-1.009 7.44,-3.027 1.74,-2.034 2.63,-4.948 2.66,-8.74 v -1.978 c 0,-3.857 -0.83,-6.803 -2.51,-8.838 -1.68,-2.034 -4.11,-3.051 -7.3,-3.051 z m 41.7,30.566 c -0.26,-0.505 -0.49,-1.326 -0.69,-2.466 -1.88,1.97 -4.2,2.954 -6.93,2.954 -2.65,0 -4.82,-0.757 -6.49,-2.27 -1.68,-1.514 -2.52,-3.386 -2.52,-5.615 0,-2.816 1.04,-4.973 3.13,-6.47 2.1,-1.514 5.09,-2.271 8.98,-2.271 h 3.64 v -1.733 c 0,-1.367 -0.38,-2.458 -1.15,-3.272 -0.76,-0.83 -1.93,-1.245 -3.49,-1.245 -1.35,0 -2.46,0.342 -3.32,1.026 -0.86,0.667 -1.29,1.522 -1.29,2.563 H 1639 c 0,-1.448 0.48,-2.799 1.44,-4.053 0.96,-1.269 2.27,-2.262 3.91,-2.978 1.66,-0.716 3.51,-1.074 5.54,-1.074 3.09,0 5.56,0.781 7.4,2.343 1.84,1.547 2.78,3.728 2.83,6.543 v 11.914 c 0,2.377 0.33,4.273 1,5.689 v 0.415 z m -6.52,-4.272 c 1.17,0 2.27,-0.285 3.29,-0.855 1.05,-0.57 1.83,-1.335 2.35,-2.295 v -4.98 h -3.2 c -2.2,0 -3.85,0.382 -4.96,1.147 -1.1,0.765 -1.66,1.847 -1.66,3.247 0,1.14 0.38,2.051 1.13,2.735 0.76,0.667 1.78,1.001 3.05,1.001 z m 32.59,-2.906 c 0,-1.058 -0.44,-1.863 -1.32,-2.417 -0.86,-0.553 -2.3,-1.041 -4.32,-1.465 -2.02,-0.423 -3.7,-0.96 -5.05,-1.611 -2.96,-1.432 -4.45,-3.507 -4.45,-6.225 0,-2.279 0.96,-4.183 2.89,-5.713 1.92,-1.53 4.36,-2.295 7.32,-2.295 3.16,0 5.7,0.781 7.64,2.343 1.95,1.563 2.93,3.589 2.93,6.08 h -5.93 c 0,-1.14 -0.42,-2.084 -1.27,-2.832 -0.85,-0.765 -1.97,-1.148 -3.37,-1.148 -1.3,0 -2.37,0.301 -3.2,0.903 -0.81,0.603 -1.22,1.408 -1.22,2.417 0,0.912 0.38,1.62 1.15,2.124 0.76,0.505 2.31,1.018 4.64,1.538 2.32,0.505 4.15,1.115 5.47,1.832 1.33,0.699 2.31,1.546 2.95,2.539 0.65,0.992 0.98,2.197 0.98,3.613 0,2.376 -0.99,4.305 -2.96,5.786 -1.97,1.465 -4.55,2.197 -7.74,2.197 -2.16,0 -4.09,-0.39 -5.78,-1.172 -1.7,-0.781 -3.01,-1.855 -3.96,-3.222 -0.94,-1.367 -1.41,-2.84 -1.41,-4.419 h 5.76 c 0.08,1.4 0.61,2.482 1.58,3.247 0.98,0.749 2.27,1.123 3.89,1.123 1.56,0 2.75,-0.293 3.56,-0.879 0.81,-0.602 1.22,-1.383 1.22,-2.344 z m 19.61,-4.15 -2.64,2.71 v 8.618 h -5.93 v -37.5 h 5.93 v 21.631 l 1.85,-2.319 7.3,-8.228 h 7.13 l -9.81,11.011 10.86,15.405 h -6.86 z m -77.2,62.052 h -13.77 l -2.88,8.276 h -6.42 l 13.42,-35.547 h 5.55 l 13.45,35.547 h -6.45 z m -12.04,-4.981 h 10.31 l -5.16,-14.746 z m 38.7,-7.739 c -0.78,-0.13 -1.59,-0.195 -2.42,-0.195 -2.72,0 -4.55,1.041 -5.49,3.125 v 18.066 h -5.93 v -26.416 h 5.66 l 0.15,2.954 c 1.43,-2.295 3.41,-3.442 5.95,-3.442 0.85,0 1.55,0.114 2.1,0.342 z m 17.58,0 c -0.78,-0.13 -1.59,-0.195 -2.42,-0.195 -2.72,0 -4.55,1.041 -5.49,3.125 v 18.066 h -5.94 v -26.416 h 5.67 l 0.14,2.954 c 1.44,-2.295 3.42,-3.442 5.96,-3.442 0.85,0 1.55,0.114 2.1,0.342 z m 18.8,20.996 c -0.26,-0.505 -0.49,-1.326 -0.69,-2.466 -1.89,1.97 -4.2,2.954 -6.93,2.954 -2.65,0 -4.82,-0.757 -6.5,-2.27 -1.67,-1.514 -2.51,-3.386 -2.51,-5.615 0,-2.816 1.04,-4.973 3.12,-6.47 2.1,-1.514 5.1,-2.271 8.99,-2.271 h 3.64 v -1.733 c 0,-1.367 -0.39,-2.458 -1.15,-3.272 -0.77,-0.83 -1.93,-1.245 -3.49,-1.245 -1.35,0 -2.46,0.342 -3.32,1.026 -0.86,0.667 -1.3,1.522 -1.3,2.563 h -5.93 c 0,-1.448 0.48,-2.799 1.44,-4.053 0.96,-1.269 2.26,-2.262 3.91,-2.978 1.66,-0.716 3.51,-1.074 5.54,-1.074 3.09,0 5.56,0.781 7.4,2.343 1.84,1.547 2.78,3.728 2.83,6.543 v 11.914 c 0,2.377 0.33,4.273 1,5.689 v 0.415 z m -6.52,-4.272 c 1.17,0 2.27,-0.285 3.29,-0.855 1.04,-0.57 1.83,-1.335 2.35,-2.295 v -4.98 h -3.2 c -2.2,0 -3.85,0.382 -4.96,1.147 -1.1,0.765 -1.66,1.847 -1.66,3.247 0,1.14 0.38,2.051 1.13,2.735 0.76,0.667 1.78,1.001 3.05,1.001 z m 26.63,-4.224 5.37,-17.92 h 6.33 l -10.5,30.42 c -1.61,4.443 -4.35,6.665 -8.2,6.665 -0.87,0 -1.82,-0.147 -2.86,-0.439 v -4.59 l 1.12,0.073 c 1.5,0 2.62,-0.277 3.37,-0.83 0.77,-0.537 1.37,-1.449 1.81,-2.735 l 0.85,-2.27 -9.27,-26.294 h 6.39 z" + fill="#1d1d1d" + id="path4926" /> + <path + d="m 1530.34,201.473 h 17.11 c 3.86,0 7,3.134 7,7 v 662.666 c 0,3.866 -3.14,7 -7,7 h -17.11" + stroke="#62636c" + stroke-width="4" + id="path4928" /> + <line + x1="1554.45" + y1="537.80603" + x2="1575.34" + y2="537.80603" + stroke="#62636c" + stroke-width="4" + id="line4930" /> + <path + d="m 1258,355.132 h 17.1 c 3.87,0 7,3.134 7,7 v 175.467 c 0,3.866 -3.13,7 -7,7 H 1258" + stroke="#62636c" + stroke-width="4" + id="path4932" /> + <line + x1="1282.1" + y1="447.866" + x2="1303" + y2="447.866" + stroke="#62636c" + stroke-width="4" + id="line4934" /> + </g> +</svg> -- GitLab