diff --git a/datasets/README.md b/datasets/README.md
index cf5caac3e1cd..1d8014d57ea3 100644
--- a/datasets/README.md
+++ b/datasets/README.md
@@ -7,6 +7,21 @@
[](https://flower.ai/join-slack)
Flower Datasets (`flwr-datasets`) is a library to quickly and easily create datasets for federated learning, federated evaluation, and federated analytics. It was created by the `Flower Labs` team that also created Flower: A Friendly Federated Learning Framework.
+
+
+> [!TIP]
+> For complete documentation that includes API docs, how-to guides and tutorials please visit the [Flower Datasets Documentation](https://flower.ai/docs/datasets/) and for full FL example see the [Flower Examples page](https://github.com/adap/flower/tree/main/examples).
+
+## Installation
+
+For a complete installation guide visit the [Flower Datasets Documenation](https://flower.ai/docs/datasets/)
+
+```bash
+pip install flwr-datasets[vision]
+```
+
+## Overview
+
Flower Datasets library supports:
* **downloading datasets** - choose the dataset from Hugging Face's `datasets`,
* **partitioning datasets** - customize the partitioning scheme,
@@ -21,43 +36,28 @@ Thanks to using Hugging Face's `datasets` used under the hood, Flower Datasets i
* Jax,
* Arrow.
-Create **custom partitioning schemes** or choose from the **implemented partitioning schemes**:
+Create **custom partitioning schemes** or choose from the **implemented [partitioning schemes](https://flower.ai/docs/datasets/ref-api/flwr_datasets.partitioner.html#module-flwr_datasets.partitioner)**:
+
* Partitioner (the abstract base class) `Partitioner`
* IID partitioning `IidPartitioner(num_partitions)`
-* Natural ID partitioner `NaturalIdPartitioner`
+* Dirichlet partitioning `DirichletPartitioner(num_partitions, partition_by, alpha)`
+* InnerDirichlet partitioning `InnerDirichletPartitioner(partition_sizes, partition_by, alpha)`
+* Natural ID partitioner `NaturalIdPartitioner(partition_by)`
* Size partitioner (the abstract base class for the partitioners dictating the division based the number of samples) `SizePartitioner`
-* Linear partitioner `LinearPartitioner`
-* Square partitioner `SquarePartitioner`
-* Exponential partitioner `ExponentialPartitioner`
-* more to come in future releases.
-
-# Installation
-
-## With pip
+* Linear partitioner `LinearPartitioner(num_partitions)`
+* Square partitioner `SquarePartitioner(num_partitions)`
+* Exponential partitioner `ExponentialPartitioner(num_partitions)`
+* more to come in the future releases (contributions are welcome).
+
+
+
+ Comparison of Partitioning Schemes on CIFAR10
+
-Flower Datasets can be installed from PyPi
-
-```bash
-pip install flwr-datasets
-```
-
-Install with an extension:
-
-* for image datasets:
-
-```bash
-pip install flwr-datasets[vision]
-```
-
-* for audio datasets:
-
-```bash
-pip install flwr-datasets[audio]
-```
+PS: This plot was generated using a library function (see [flwr_datasets.visualization](https://flower.ai/docs/datasets/ref-api/flwr_datasets.visualization.html) package for more).
-If you plan to change the type of the dataset to run the code with your ML framework, make sure to have it installed too.
-# Usage
+## Usage
Flower Datasets exposes the `FederatedDataset` abstraction to represent the dataset needed for federated learning/evaluation/analytics. It has two powerful methods that let you handle the dataset preprocessing: `load_partition(partition_id, split)` and `load_split(split)`.
@@ -67,16 +67,16 @@ Here's a basic quickstart example of how to partition the MNIST dataset:
from flwr_datasets import FederatedDataset
# The train split of the MNIST dataset will be partitioned into 100 partitions
-mnist_fds = FederatedDataset("mnist", partitioners={"train": 100}
+fds = FederatedDataset("mnist", partitioners={"train": 100})
-mnist_partition_0 = mnist_fds.load_partition(0, "train")
+partition = fds.load_partition(0)
-centralized_data = mnist_fds.load_split("test")
+centralized_data = fds.load_split("test")
```
For more details, please refer to the specific how-to guides or tutorial. They showcase customization and more advanced features.
-# Future release
+## Future release
Here are a few of the things that we will work on in future releases:
@@ -85,6 +85,6 @@ Here are a few of the things that we will work on in future releases:
* ✅ More out-of-the-box `Partitioner`s.
* ✅ Passing `Partitioner`s via `FederatedDataset`'s `partitioners` argument.
* ✅ Customization of the dataset splitting before the partitioning.
-* Simplification of the dataset transformation to the popular frameworks/types.
+* ✅ Simplification of the dataset transformation to the popular frameworks/types.
* Creation of the synthetic data,
* Support for Vertical FL.
diff --git a/datasets/dev/format.sh b/datasets/dev/format.sh
index 8292e0b3ed79..c6977982dd6c 100755
--- a/datasets/dev/format.sh
+++ b/datasets/dev/format.sh
@@ -3,9 +3,16 @@ set -e
cd "$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"/../
# Python
-echo "Formatting started"
+echo "Formatting started: Python"
python -m isort flwr_datasets/
python -m black -q flwr_datasets/
python -m docformatter -i -r flwr_datasets/
python -m ruff check --fix flwr_datasets/
-echo "Formatting done"
+echo "Formatting done: Python"
+
+# Notebooks
+echo "Formatting started: Notebooks"
+python -m black --ipynb -q doc/source/*.ipynb
+KEYS="metadata.celltoolbar metadata.language_info metadata.toc metadata.notify_time metadata.varInspector metadata.accelerator metadata.vscode cell.metadata.id cell.metadata.heading_collapsed cell.metadata.hidden cell.metadata.code_folding cell.metadata.tags cell.metadata.init_cell cell.metadata.vscode cell.metadata.pycharm"
+python -m nbstripout --keep-output doc/source/*.ipynb --extra-keys "$KEYS"
+echo "Formatting done: Notebooks"
diff --git a/datasets/doc/source/_static/readme/comparison_of_partitioning_schemes.png b/datasets/doc/source/_static/readme/comparison_of_partitioning_schemes.png
new file mode 100644
index 000000000000..ed2e323ef649
Binary files /dev/null and b/datasets/doc/source/_static/readme/comparison_of_partitioning_schemes.png differ
diff --git a/datasets/doc/source/conf.py b/datasets/doc/source/conf.py
index 755147bc9e1d..11285c375f96 100644
--- a/datasets/doc/source/conf.py
+++ b/datasets/doc/source/conf.py
@@ -38,7 +38,7 @@
author = "The Flower Authors"
# The full version, including alpha/beta/rc tags
-release = "0.1.0"
+release = "0.2.0"
# -- General configuration ---------------------------------------------------
diff --git a/datasets/doc/source/how-to-install-flwr-datasets.rst b/datasets/doc/source/how-to-install-flwr-datasets.rst
index d2fd7923a817..c690ffb1b09c 100644
--- a/datasets/doc/source/how-to-install-flwr-datasets.rst
+++ b/datasets/doc/source/how-to-install-flwr-datasets.rst
@@ -42,5 +42,5 @@ If everything worked, it should print the version of Flower Datasets to the comm
.. code-block:: none
- 0.0.1
+ 0.2.0
diff --git a/datasets/doc/source/how-to-visualize-label-distribution.ipynb b/datasets/doc/source/how-to-visualize-label-distribution.ipynb
new file mode 100644
index 000000000000..26db72047cff
--- /dev/null
+++ b/datasets/doc/source/how-to-visualize-label-distribution.ipynb
@@ -0,0 +1,1122 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "fb7e89caa9e6d772",
+ "metadata": {},
+ "source": [
+ "# Visualize Label Distribution"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "67c54a8d7c872547",
+ "metadata": {},
+ "source": [
+ "If you partition datasets to simulate heterogeneity through label skew and/or size skew, you can now effortlessly visualize the partitioned dataset using `flwr-datasets`.\n",
+ "\n",
+ "In this how-to guide, you'll learn how to visualize and compare partitioned datasets when applying different methods or parameters.\n",
+ "\n",
+ "All the described visualization functions are compatible with all ``Partitioner`` you can find in\n",
+ "[flwr_datasets.partitioner](https://flower.ai/docs/datasets/ref-api/flwr_datasets.partitioner.html#module-flwr_datasets.partitioner)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7220467f2c6ba432",
+ "metadata": {},
+ "source": [
+ "## Common Setup"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4e2ad2f0a0f7174d",
+ "metadata": {},
+ "source": [
+ "Install Flower Datasets library:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c46514b679f394ce",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "! pip install -q \"flwr-datasets[vision]\""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d7ffd5b6836a5ee0",
+ "metadata": {},
+ "source": [
+ "## Plot Label Distribution"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "38fbbdfe6b930916",
+ "metadata": {},
+ "source": [
+ "### Bar plot"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a5778edf97a7ee04",
+ "metadata": {},
+ "source": [
+ "Let's visualize the result of `DirichletPartitioner`.\n",
+ "We will create a `FederatedDataset` and assign `DirichletPartitioner` to the `train` split:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "42397afaaf50529e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from flwr_datasets import FederatedDataset\n",
+ "from flwr_datasets.partitioner import DirichletPartitioner\n",
+ "from flwr_datasets.visualization import plot_label_distributions\n",
+ "\n",
+ "\n",
+ "fds = FederatedDataset(\n",
+ " dataset=\"cifar10\",\n",
+ " partitioners={\n",
+ " \"train\": DirichletPartitioner(\n",
+ " num_partitions=10,\n",
+ " partition_by=\"label\",\n",
+ " alpha=0.3,\n",
+ " seed=42,\n",
+ " min_partition_size=0,\n",
+ " ),\n",
+ " },\n",
+ ")\n",
+ "\n",
+ "partitioner = fds.partitioners[\"train\"]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c4d5855ee8a605d3",
+ "metadata": {},
+ "source": [
+ "Once we have the partitioner with the dataset assigned, we are ready to pass it to the plotting function:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f75b48256ed68897",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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ACBkZGSU7kkgIiIileHvb5ISyexjXtVxH1QiIqKqh7+/SUoku8aciIiIiOh9wsSciIiIiEgCmJgTEREREUkAE3MiIiIiIglgYk5EREREJAFMzImIiIiIJEBD1QEQEREpW50N/ZTex59+vyq9DyKq3jhjTkREREQkAUzMiYiIiIgkgIk5EREREZEEMDEnIiIiIpIAJuZERERERBLAxJyIiIiISAKYmBMRERERSQATcyIiIiIiCWBiTkREREQkAUzMiYiIiIgkgIk5EREREZEEMDEnIiIiIpIAJuZERERERBLAxJyIiIiISAKYmBMRERERSQATcyIiIiIiCWBiTkREREQkAUzMiYiIiIgkQEPVARARESlb33pmqg6BiOhfccaciIiIiEgCmJgTEREREUkAE3MiIiIiIglgYk5EREREJAFMzImIiIiIJICJORERERGRBDAxJyIiIiKSACbmREREREQSwMSciIiIiEgCmJgTEREREUkAE3MiIiIiIglgYk5EREREJAFMzImIiIiIJICJORERERGRBDAxJyIiIiKSACbmREREREQSwMSciIiIiEgCmJgTEREREUkAE3MiIiIiIglgYk5EREREJAFMzImIiIiIJICJORERERGRBDAxJyIiIiKSAA1VB0BERKRsk9w7qDoEIqJ/xRlzIiIiIiIJYGJORERERCQBXMpCREREVAnkcjlyc3NVHQZVIk1NTairq5e4PhNzIiIiIiXLzc1FcnIy5HK5qkOhSmZiYgJra2vIZLJ/rcvEnIiIiEiJBEHAgwcPoK6uDjs7O6ipcSXx+0AQBDx//hxpaWkAABsbm3+9hok5ERERkRLl5+fj+fPnsLW1hZ6enqrDoUqkq6sLAEhLS4OlpeW/LmvhRzYiIiIiJSooKAAAaGlpqTgSUoXCD2N5eXn/WpeJOREREVElKMkaY6p+SvO6MzEnIiIiIpIAJuZEREREVCE2btwIExOTcrcjk8mwZ8+ecrdT1TAxJyIiIiKRr68vevfureow3ktMzImIiIiIJEDSiXlBQQGmT58OR0dH6OrqwsnJCbNnz4YgCGIdQRAwY8YM2NjYQFdXF15eXrh165ZCO0+ePMGgQYNgZGQEExMT+Pn5ISsrS6HO5cuX0aFDB+jo6MDOzg7z58+vlDESERERVRWLFy9Go0aNoK+vDzs7O3z99ddFcioA2LNn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i4uLg76+fqX2WdUxMSciIiKiCmdhYaHqEKocLmUhIiIiomLt3LkTjRo1gq6uLszNzeHl5YXs7Gzx/MKFC2FjYwNzc3P4+/sjLy9PPPfmUhaZTIY1a9agW7du0NXVRZ06dbBz587KHI7kMTEnIiIioiIePHiAgQMHYujQoUhMTER0dDT69u0LQRAAACdOnMCdO3dw4sQJREREYOPGjdi4ceM725w+fTr69euHS5cuYdCgQRgwYAASExMrYTRVA5eyEBEREVERDx48QH5+Pvr27Qt7e3sAQKNGjcTzpqamWLlyJdTV1VG/fn306NEDUVFRGD58+Fvb/PTTTzFs2DAAwOzZsxEZGYkVK1Zg9erVyh1MFcEZcyIiIiIqokmTJujcuTMaNWqETz/9FOvXr8fTp0/F8w0aNIC6urp4bGNjg7S0tHe26eHhUeSYM+b/j4k5ERERERWhrq6OyMhIHDp0CG5ublixYgVcXFyQnJwMANDU1FSoL5PJIJfLVRFqtcHEnIiIiIiKJZPJ0K5dOwQHB+PixYvQ0tLC7t27y9ze2bNnixy7urqWN8xqg2vMiYiIiKiI2NhYREVFoUuXLrC0tERsbCwePXoEV1dXXL58uUxt/vLLL3B3d0f79u2xZcsWnDt3Dhs2bKjgyKsuJuZEREREVISRkRFOnTqFpUuXIjMzE/b29li0aBG6deuG7du3l6nN4OBgbNu2DV9//TVsbGzw888/w83NrYIjr7qYmBMRUbVn8aISOtGthD6oWqnsO3GWlqurKw4fPlzsueK2RXx9z3IASElJKVLH1tYWR48erYDoqieuMSciIiIikgAm5kREREREEsClLERERESkdIV3DKW344w5EREREZEEMDEnIiIiIpIAJuZERERERBLAxJyIiIiISAKYmBMRERERSQB3ZVGxCb8PV2r7CzusV2r7RERERFQxOGNOREREREV4enoiMDBQ1WG8VzhjTkRERKQCyv6r+Zv4V3Tp44w5ERERESldbm6uqkOQPCbmRERERFQsuVyOSZMmwczMDNbW1ggKChLP3b17F7169YKBgQGMjIzw2WefITU1VTwfFBSEpk2b4ocffoCjoyN0dHQAADt37kSjRo2gq6sLc3NzeHl5ITs7W7zuhx9+gKurK3R0dFC/fn2sXr260saralzKQkRERETFioiIwPjx4xEbG4uYmBj4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",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "fig, ax, df = plot_label_distributions(\n",
+ " partitioner,\n",
+ " label_name=\"label\",\n",
+ " plot_type=\"bar\",\n",
+ " size_unit=\"absolute\",\n",
+ " partition_id_axis=\"x\",\n",
+ " legend=True,\n",
+ " verbose_labels=True,\n",
+ " title=\"Per Partition Labels Distribution\",\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "be05badab744d9f7",
+ "metadata": {},
+ "source": [
+ "You can configure many details directly using the function parameters. The ones that can interest you the most are:\n",
+ "\n",
+ "* `size_unit` to have the sizes normalized such that they sum up to 1 and express the fraction of the data in each partition,\n",
+ "* `legend` and `verbose_labels` in case the dataset has more descriptive names and not numbers,\n",
+ "* `cmap` to change the values of the bars (for an overview of the available colors, have a look at [link](https://matplotlib.org/stable/users/explain/colors/colormaps.html); check out `cmap=\"tab20b\"`) \n",
+ "\n",
+ " And for even greater control, you can specify `plot_kwargs` and `legend_kwargs` as `Dict`, which will be further passed to the `plot` and `legend` functions."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3dbf6dc4ede79f05",
+ "metadata": {},
+ "source": [
+ "You can also inspect the exact numbers that were used to create this plot. Three objects are returned (see reference [here](https://flower.ai/docs/datasets/ref-api/flwr_datasets.visualization.plot_label_distributions.html#flwr_datasets.visualization.plot_label_distributions)). Let's inspect the returned DataFrame."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f6edd14d8b260e9e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
airplane
\n",
+ "
automobile
\n",
+ "
bird
\n",
+ "
cat
\n",
+ "
deer
\n",
+ "
dog
\n",
+ "
frog
\n",
+ "
horse
\n",
+ "
ship
\n",
+ "
truck
\n",
+ "
\n",
+ "
\n",
+ "
Partition ID
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0
\n",
+ "
817
\n",
+ "
794
\n",
+ "
1462
\n",
+ "
2123
\n",
+ "
432
\n",
+ "
25
\n",
+ "
456
\n",
+ "
384
\n",
+ "
14
\n",
+ "
9
\n",
+ "
\n",
+ "
\n",
+ "
1
\n",
+ "
1416
\n",
+ "
6
\n",
+ "
97
\n",
+ "
5
\n",
+ "
3
\n",
+ "
0
\n",
+ "
3409
\n",
+ "
0
\n",
+ "
3
\n",
+ "
868
\n",
+ "
\n",
+ "
\n",
+ "
2
\n",
+ "
0
\n",
+ "
4
\n",
+ "
11
\n",
+ "
2
\n",
+ "
454
\n",
+ "
3
\n",
+ "
511
\n",
+ "
15
\n",
+ "
84
\n",
+ "
21
\n",
+ "
\n",
+ "
\n",
+ "
3
\n",
+ "
762
\n",
+ "
159
\n",
+ "
1100
\n",
+ "
51
\n",
+ "
120
\n",
+ "
166
\n",
+ "
2
\n",
+ "
1982
\n",
+ "
1351
\n",
+ "
2175
\n",
+ "
\n",
+ "
\n",
+ "
4
\n",
+ "
2
\n",
+ "
43
\n",
+ "
714
\n",
+ "
2
\n",
+ "
19
\n",
+ "
2400
\n",
+ "
425
\n",
+ "
1
\n",
+ "
151
\n",
+ "
477
\n",
+ "
\n",
+ "
\n",
+ "
5
\n",
+ "
67
\n",
+ "
79
\n",
+ "
170
\n",
+ "
25
\n",
+ "
2552
\n",
+ "
477
\n",
+ "
27
\n",
+ "
44
\n",
+ "
590
\n",
+ "
0
\n",
+ "
\n",
+ "
\n",
+ "
6
\n",
+ "
422
\n",
+ "
2
\n",
+ "
4
\n",
+ "
486
\n",
+ "
380
\n",
+ "
92
\n",
+ "
90
\n",
+ "
380
\n",
+ "
50
\n",
+ "
6
\n",
+ "
\n",
+ "
\n",
+ "
7
\n",
+ "
122
\n",
+ "
2811
\n",
+ "
597
\n",
+ "
2174
\n",
+ "
1038
\n",
+ "
1727
\n",
+ "
1
\n",
+ "
682
\n",
+ "
515
\n",
+ "
4
\n",
+ "
\n",
+ "
\n",
+ "
8
\n",
+ "
256
\n",
+ "
29
\n",
+ "
342
\n",
+ "
75
\n",
+ "
1
\n",
+ "
84
\n",
+ "
8
\n",
+ "
1511
\n",
+ "
2240
\n",
+ "
1417
\n",
+ "
\n",
+ "
\n",
+ "
9
\n",
+ "
1136
\n",
+ "
1073
\n",
+ "
503
\n",
+ "
57
\n",
+ "
1
\n",
+ "
26
\n",
+ "
71
\n",
+ "
1
\n",
+ "
2
\n",
+ "
23
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " airplane automobile bird cat deer dog frog horse ship \\\n",
+ "Partition ID \n",
+ "0 817 794 1462 2123 432 25 456 384 14 \n",
+ "1 1416 6 97 5 3 0 3409 0 3 \n",
+ "2 0 4 11 2 454 3 511 15 84 \n",
+ "3 762 159 1100 51 120 166 2 1982 1351 \n",
+ "4 2 43 714 2 19 2400 425 1 151 \n",
+ "5 67 79 170 25 2552 477 27 44 590 \n",
+ "6 422 2 4 486 380 92 90 380 50 \n",
+ "7 122 2811 597 2174 1038 1727 1 682 515 \n",
+ "8 256 29 342 75 1 84 8 1511 2240 \n",
+ "9 1136 1073 503 57 1 26 71 1 2 \n",
+ "\n",
+ " truck \n",
+ "Partition ID \n",
+ "0 9 \n",
+ "1 868 \n",
+ "2 21 \n",
+ "3 2175 \n",
+ "4 477 \n",
+ "5 0 \n",
+ "6 6 \n",
+ "7 4 \n",
+ "8 1417 \n",
+ "9 23 "
+ ]
+ },
+ "execution_count": null,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2902213a",
+ "metadata": {},
+ "source": [
+ "Each row represents a unique partition ID, and the columns represent unique labels (either in the verbose version if `verbose_labels=True` or typically `int` values otherwise, representing the partition IDs).\n",
+ "That you can index the DataFrame `df[partition_id, label_id]` to get the number of samples in `partition_id` for the specified `label_id.`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "8ffe4039",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "714"
+ ]
+ },
+ "execution_count": null,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.loc[4, \"bird\"]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2e6c17af529a668f",
+ "metadata": {},
+ "source": [
+ "Let's see a plot with `size_unit=\"percent\"`, which is another excellent way to understand the partitions. In this mode, the number of datapoints for each class in a given partition are normalized, so they sum up to 100."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "a241894a47f3cc9f",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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SgAAAPsKCwuTu7u7Nm/enGnf999/r5CQEI0ePVr169dXWFiYfv/9d4tjXFxclJ6enl/lFgmFYslHUlKSevToocWLF2vSpEnm9itXrujtt9/We++9p4ceekjSzdv7hYeH64cfftD9999vr5IBAADsws3NTSNHjtSIESPk4uKiJk2a6MKFC/rll18UFhamU6dO6YMPPlCDBg30+eefa82aNRbnlytXTidOnFBCQoLKlCkjb29viwf7IbNCEahjYmLUtm1bRUZGWgTqvXv36saNG4qMjDS3ValSRWXLltXOnTvvGKhTUlKUkpJi3k5MTLRd8QAAoMjJzwet5MaYMWPk5OSksWPH6s8//1RgYKCee+459e7dWy+88IJiY2OVkpKitm3basyYMRo/frz53M6dO2v16tV68MEHdfnyZS1ZskTR0dF2u5bCoMAH6g8++ED79u3T7t27M+07e/asXFxc5Ovra9Hu7++vs2fP3rHPqVOnKi4uLq9LBQAAKBAcHBw0evRojR49OtO+6dOna/r06RZt//58mqurqz7++GNbl1ikFOg11KdPn9agQYO0cuVKubm55Vm/L774oq5cuWJ+nT59Os/6BgAAwL2lQAfqvXv36vz586pbt66cnJzk5OSkbdu2ae7cuXJycpK/v79SU1N1+fJli/POnTt313snurq6ysfHx+IFAAAA5EaBXvLRsmVLHThwwKLtmWeeUZUqVTRy5EgFBwfL2dlZmzdvVufOnSVJhw8f1qlTpxQREWGPkgEAKJL27V2VD6PUzocxgLxXoAO1t7e3qlevbtHm6ekpPz8/c3vv3r01ZMgQlShRQj4+PhowYIAiIiK4wwcAAADyRYEO1Nnx2muvycHBQZ07d1ZKSopatWqlBQsW2LssAADMHvpf3n0OCEDBU+gC9datWy223dzc9Prrr+v111+3T0EAAAC4pxXoDyUCAAAABR2BGgAAALACgRoAAACwAoEaAACgiGnRooXF0w9vV65cOc2ePTvH/Y4fP161a9fOdV1FVaH7UCIAAIC99Xmpcb6O99aU7/O0v927d8vT0zNP+7yXEagBAAXW6lX7bD5Gm9o2HwIocEqWLHnX/Tdu3JCzs3M+VVP4seQDAACgCEpLS1NsbKyKFSum++67T2PGjJFhGJIyL/kwmUxauHChHnvsMXl6emry5MmSpFdeeUX+/v7y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SBkZGapevbpSU1PveI6np2e+jevs7Gz+2mQySZIyMjIkSUlJSXr22Wc1cODATP2XLVvW6hrzGoEaAACgiLl48aIOHz6sxYsXq1mzZpJufsgvN06dOqU///xTQUFBkqQffvhBDg4Oqly5ss3GrVu3rg4ePKiKFSvmqub8RqAGAAAoYooXLy4/Pz+9+eabCgwM1KlTpzRq1Khc9eXm5qaoqCjNmDFDiYmJGjhwoJ544oks10/n1bgjR47U/fffr9jYWPXp00eenp46ePCgNm3apPnz5+fqOmyJNdQAAABFjIODgz744APt3btX1atX1wsvvKBXX301V31VrFhRnTp1Ups2bfTwww+rZs2aWrAg69v75tW4NWvW1LZt23TkyBE1a9ZMderU0dixY82z5AUNM9QAUEStXrXPpv23qW3T7oECLa8ftGILkZGROnjwoEWbYRhZft2iRQuL7dv1799f/fv3z3Lf0qVLczRuuXLlMo3l6+ubqa1Bgwb66quv7lhTQUKgBoAiivvMA0D+YMkHAAAAYAUCNQAAALI0fvz4uz5ZETcV6EA9depUNWjQQN7e3ipVqpQ6dOiQ6Sbi169fV0xMjPz8/OTl5aXOnTvr3LlzdqoYAAAA95oCHai3bdummJgY/fDDD9q0aZNu3Lihhx9+WMnJyeZjXnjhBX366af66KOPtG3bNv3555/q1KmTHasGAADAvaRAfyhxw4YNFttLly5VqVKltHfvXj3wwAO6cuWK3n77bb333nt66KGHJElLlixReHi4fvjhB91///32KBsAABQhd7v7BYq27P7sC/QM9e2uXLkiSSpRooQkae/evbpx44YiIyPNx1SpUkVly5bVzp0779hPSkqKEhMTLV4AAAD/duvR2NeuXbNzJbCXWz/7fz8mPSsFeob63zIyMjR48GA1adJE1atXlySdPXtWLi4u8vX1tTjW399fZ8+evWNfU6dOVVxcnC3LBQAAhZyjo6N8fX11/vx5SZKHh4dMJpOdq0J+MAxD165d0/nz5+Xr6ytHR8e7Hl9oAnVMTIx+/vnnXD+H/t9efPFFDRkyxLydmJio4OBgq/sFAABFy63Ha98K1bi3+Pr6ZvmI9dsVikAdGxurzz77TN9++63KlCljbg8ICFBqaqouX75sMUt97ty5u168q6urXF1dbVkyAAAoAkwmkwIDA1WqVCnduHHD3uUgHzk7O//nzPQtBTpQG4ahAQMGaM2aNdq6datCQ0Mt9terV0/Ozs7avHmzOnfuLEk6fPiwTp06pYiICHuUDAAAiiBHR8dshyvcewp0oI6JidF7772ndevWydvb27wuulixYnJ3d1exYsXUu3dvDRkyRCVKlJCPj48GDBigiIgI7vABAACAfFGgA/XChQslSS1atLBoX7JkiaKjoyVJr732mhwcHNS5c2elpKSoVatWWrBgQT5XCgAAgHtVgQ7U2bn3n5ubm15//XW9/vrr+VARgLtZufxtm48xtH6MzccAACAnCnSgBlC4hPdqbO8SAADIdwRqAHlm9ap9Nh+jTW2bDwEAQI4UqiclAgAAAAUNgRoAAACwAoEaAAAAsAKBGgAAALACgRoAAACwAoEaAAAAsAKBGgAAALACgRoAAACwAoEaAAAAsAKBGgAAALACgRoAAACwAoEaAAAAsAKBGgAAALACgRoAAACwAoEaAAAAsIKTvQsAAKDIa3Dd3hUAsCFmqAEAAAArEKgBAAAAK7DkI5f27V2VD6PUzocxAAAAYA1mqAEAAAArMEMNAICN7XM6ZPMx2th8BAB3QqAGCgi35AX2LgEAAOQCSz4AAAAAKxCoAQAAACsQqAEAAAArsIYaAAAbW71qn83HaFPb5kMAuANmqAEAAAArEKgBAAAAK7DkAyggePomAACFEzPUAAAAgBUI1AAAAIAVCNQAAACAFVhDDQC3Ce/V2N4lAAAKEWaoAQAAACswQw0At+EhHACAnGCGGgAAALACgRoAAACwAoEaAAAAsAKBGgAAALACgRoAAACwAoEaAAAAsAKBGgAAALACgRoAAACwAoEaAAAAsAKBGgAAALACjx4HAMDG3JIX2LsEADbEDDUAAABgBWaoAQCwsX17V+XDKLXzYQwAWWGGGgAAALACM9QAcBvWuwIAcoIZagAAAMAKBGoAAADACgRqAAAAwAoEagAAAMAKBGoAAADACgRqAAAAwArcNg+FXnivxvYuAUUMD+EAAOREkQnUr7/+ul599VWdPXtWtWrV0rx589SwYUN7l4V8sHrVPpuP0aa2zYcAkAV+uQFQGBSJQP3hhx9qyJAhWrRokRo1aqTZs2erVatWOnz4sEqVKmXv8oB7Bg9EAQDci4rEGupZs2apb9++euaZZ1S1alUtWrRIHh4eeuedd+xdGgAAAIq4Qj9DnZqaqr179+rFF180tzk4OCgyMlI7d+60Y2XIL8yKAgAAeyr0gfqvv/5Senq6/P39Ldr9/f3166+/ZnlOSkqKUlJSzNtXrlyRJCUmJmZ73LS0lP8+yEo5qSe3bH0d+XENqSlJNh+jKPwsJNtfBz+L7CsK11EUrkHiOrKrIF7DreMNw7BFOUC2mYxC/i78888/Vbp0aX3//feKiIgwt48YMULbtm1TfHx8pnPGjx+vuLi4/CwTAADYyOnTp1WmTBl7l4F7WKGfob7vvvvk6Oioc+fOWbSfO3dOAQEBWZ7z4osvasiQIebtjIwM/f333/Lz85PJZMrzGhMTExUcHKzTp0/Lx8cnz/vPL1xHwVEUrkEqGtdRFK5B4joKkqJwDVL+XIdhGLp69aqCgoJs0j+QXYU+ULu4uKhevXravHmzOnToIOlmQN68ebNiY2OzPMfV1VWurq4Wbb6+vjauVPLx8SnU/3O8hesoOIrCNUhF4zqKwjVIXEdBUhSuQbL9dRQrVsxmfQPZVegDtSQNGTJEUVFRql+/vho2bKjZs2crOTlZzzzzjL1LAwAAQBFXJAJ1165ddeHCBY0dO1Znz55V7dq1tWHDhkwfVAQAAADyWpEI1JIUGxt7xyUe9ubq6qpx48ZlWmZS2HAdBUdRuAapaFxHUbgGiesoSIrCNUhF5zqA7Cj0d/kAAAAA7KlIPCkRAAAAsBcCNQAAAGAFAjUAAABgBQI1AAAAYAUCdT54/fXXVa5cObm5ualRo0batWuXvUvKkW+//VaPPvqogoKCZDKZtHbtWnuXlGNTp05VgwYN5O3trVKlSqlDhw46fPiwvcvKsYULF6pmzZrmByVEREToyy+/tHdZVnnllVdkMpk0ePBge5eSI+PHj5fJZLJ4ValSxd5l5coff/yhp556Sn5+fnJ3d1eNGjW0Z88ee5eVbeXKlcv0szCZTIqJibF3aTmSnp6uMWPGKDQ0VO7u7qpQoYImTpyownbvgKtXr2rw4MEKCQmRu7u7GjdurN27d9u7LMCmCNQ29uGHH2rIkCEaN26c9u3bp1q1aqlVq1Y6f/68vUvLtuTkZNWqVUuvv/66vUvJtW3btikmJkY//PCDNm3apBs3bujhhx9WcnKyvUvLkTJlyuiVV17R3r17tWfPHj300ENq3769fvnlF3uXliu7d+/WG2+8oZo1a9q7lFypVq2azpw5Y35t377d3iXl2KVLl9SkSRM5Ozvryy+/1MGDBzVz5kwVL17c3qVl2+7duy1+Dps2bZIkPf7443auLGemTZumhQsXav78+Tp06JCmTZum6dOna968efYuLUf69OmjTZs2acWKFTpw4IAefvhhRUZG6o8//rB3aYDtGLCphg0bGjExMebt9PR0IygoyJg6daodq8o9ScaaNWvsXYbVzp8/b0gytm3bZu9SrFa8eHHjrbfesncZOXb16lUjLCzM2LRpk9G8eXNj0KBB9i4pR8aNG2fUqlXL3mVYbeTIkUbTpk3tXUaeGjRokFGhQgUjIyPD3qXkSNu2bY1evXpZtHXq1Mno0aOHnSrKuWvXrhmOjo7GZ599ZtFet25dY/To0XaqCrA9ZqhtKDU1VXv37lVkZKS5zcHBQZGRkdq5c6cdK8OVK1ckSSVKlLBzJbmXnp6uDz74QMnJyYqIiLB3OTkWExOjtm3bWvz3UdgcPXpUQUFBKl++vHr06KFTp07Zu6QcW79+verXr6/HH39cpUqVUp06dbR48WJ7l5Vrqampevfdd9WrVy+ZTCZ7l5MjjRs31ubNm3XkyBFJ0v79+7V9+3a1bt3azpVlX1pamtLT0+Xm5mbR7u7uXij/ggNkV5F5UmJB9Ndffyk9PT3TI9D9/f3166+/2qkqZGRkaPDgwWrSpImqV69u73Jy7MCBA4qIiND169fl5eWlNWvWqGrVqvYuK0c++OAD7du3r1Cvq2zUqJGWLl2qypUr68yZM4qLi1OzZs30888/y9vb297lZdtvv/2mhQsXasiQIXrppZe0e/duDRw4UC4uLoqKirJ3eTm2du1aXb58WdHR0fYuJcdGjRqlxMREValSRY6OjkpPT9fkyZPVo0cPe5eWbd7e3oqIiNDEiRMVHh4uf39/vf/++9q5c6cqVqxo7/IAmyFQ454TExOjn3/+udDOllSuXFkJCQm6cuWKPv74Y0VFRWnbtm2FJlSfPn1agwYN0qZNmzLNYhUm/541rFmzpho1aqSQkBCtWrVKvXv3tmNlOZORkaH69etrypQpkqQ6dero559/1qJFiwploH777bfVunVrBQUF2buUHFu1apVWrlyp9957T9WqVVNCQoIGDx6soKCgQvWzWLFihXr16qXSpUvL0dFRdevWVffu3bV37157lwbYDIHahu677z45Ojrq3LlzFu3nzp1TQECAnaq6t8XGxuqzzz7Tt99+qzJlyti7nFxxcXExz/TUq1dPu3fv1pw5c/TGG2/YubLs2bt3r86fP6+6deua29LT0/Xtt99q/vz5SklJkaOjox0rzB1fX19VqlRJx44ds3cpORIYGJjpl7Hw8HB98skndqoo937//Xd9/fXXWr16tb1LyZXhw4dr1KhR6tatmySpRo0a+v333zV16tRCFagrVKigbdu2KTk5WYmJiQoMDFTXrl1Vvnx5e5cG2AxrqG3IxcVF9erV0+bNm81tGRkZ2rx5c6Fc81qYGYah2NhYrVmzRlu2bFFoaKi9S8ozGRkZSklJsXcZ2dayZUsdOHBACQkJ5lf9+vXVo0cPJSQkFMowLUlJSUk6fvy4AgMD7V1KjjRp0iTTLSSPHDmikJAQO1WUe0uWLFGpUqXUtm1be5eSK9euXZODg+U/y46OjsrIyLBTRdbx9PRUYGCgLl26pI0bN6p9+/b2LgmwGWaobWzIkCGKiopS/fr11bBhQ82ePVvJycl65pln7F1atiUlJVnMup04cUIJCQkqUaKEypYta8fKsi8mJkbvvfee1q1bJ29vb509e1aSVKxYMbm7u9u5uux78cUX1bp1a5UtW1ZXr17Ve++9p61bt2rjxo32Li3bvL29M61d9/T0lJ+fX6Fa0z5s2DA9+uijCgkJ0Z9//qlx48bJ0dFR3bt3t3dpOfLCCy+ocePGmjJlip544gnt2rVLb775pt588017l5YjGRkZWrJkiaKiouTkVDj/aXv00Uc1efJklS1bVtWqVdOPP/6oWbNmqVevXvYuLUc2btwowzBUuXJlHTt2TMOHD1eVKlUK1b97QI7Z+zYj94J58+YZZcuWNVxcXIyGDRsaP/zwg71LypFvvvnGkJTpFRUVZe/Ssi2r+iUZS5YssXdpOdKrVy8jJCTEcHFxMUqWLGm0bNnS+Oqrr+xdltUK423zunbtagQGBhouLi5G6dKlja5duxrHjh2zd1m58umnnxrVq1c3XF1djSpVqhhvvvmmvUvKsY0bNxqSjMOHD9u7lFxLTEw0Bg0aZJQtW9Zwc3Mzypcvb4wePdpISUmxd2k58uGHHxrly5c3XFxcjICAACMmJsa4fPmyvcsCbMpkGIXsEUwAAABAAcIaagAAAMAKBGoAAADACgRqAAAAwAoEagAAAMAKBGoAAADACgRqAAAAwAoEagAAAMAKBGoAhdLJkydlMpmUkJBw1+NatGihwYMH50tNAIB7E4EaQJ6Jjo6WyWSSyWSSi4uLKlasqAkTJigtLc3qfjt06GDRFhwcrDNnzpgfV75161aZTCZdvnzZ4rjVq1dr4sSJVo3/X24P97e2b728vb1VrVo1xcTE6OjRozatBQCQ/wjUAPLUI488ojNnzujo0aMaOnSoxo8fr1dffTVXfaWnpysjIyPLfY6OjgoICJCTk9Nd+yhRooS8vb1zNb61vv76a505c0b79+/XlClTdOjQIdWqVUubN2+2Sz0AANsgUAPIU66urgoICFBISIj69++vyMhIrV+/XpI0a9Ys1ahRQ56engoODtbzzz+vpKQk87lLly6Vr6+v1q9fr6pVq8rV1VW9evXSsmXLtG7dOvOM79atWy1mhU+ePKkHH3xQklS8eHGZTCZFR0dLyrzk49KlS+rZs6eKFy8uDw8PtW7d2mLW+FYNGzduVHh4uLy8vMy/JOSUn5+fAgICVL58ebVv315ff/21GjVqpN69eys9PT0X310AQEFEoAZgU+7u7kpNTZUkOTg4aO7cufrll1+0bNkybdmyRSNGjLA4/tq1a5o2bZreeust/fLLL5o7d66eeOIJc6g9c+aMGjdubHFOcHCwPvnkE0nS4cOHdebMGc2ZMyfLeqKjo7Vnzx6tX79eO3fulGEYatOmjW7cuGFRw4wZM7RixQp9++23OnXqlIYNG2b198LBwUGDBg3S77//rr1791rdHwCgYLj730oBIJcMw9DmzZu1ceNGDRgwQJIsZorLlSunSZMm6bnnntOCBQvM7Tdu3NCCBQtUq1Ytc5u7u7tSUlIUEBCQ5ViOjo4qUaKEJKlUqVLy9fXN8rijR49q/fr12rFjhzmUr1y5UsHBwVq7dq0ef/xxcw2LFi1ShQoVJEmxsbGaMGFC7r4Rt6lSpYqkm+usGzZsmCd9AgDsi0ANIE999tln8vLy0o0bN5SRkaEnn3xS48ePl3RzTfHUqVP166+/KjExUWlpabp+/bquXbsmDw8PSZKLi4tq1qxpk9oOHTokJycnNWrUyNzm5+enypUr69ChQ+Y2Dw8Pc5iWpMDAQJ0/fz5PajAMQ5JkMpnypD8AgP2x5ANAnnrwwQeVkJCgo0eP6p9//tGyZcvk6empkydPql27dqpZs6Y++eQT7d27V6+//rokmZeESDdno+0dNp2dnS22TSaTOQhb61ZwDw0NzZP+AAD2xww1gDzl6empihUrZmrfu3evMjIyNHPmTDk43PxdftWqVdnq08XF5T8/xOfi4iJJdz0uPDxcaWlpio+PNy/5uHjxog4fPqyqVatmqxZrZGRkaO7cuQoNDVWdOnVsPh4AIH8wQw0gX1SsWFE3btzQvHnz9Ntvv2nFihVatGhRts4tV66cfvrpJx0+fFh//fWXxQcIbwkJCZHJZNJnn32mCxcuWNw95JawsDC1b99effv21fbt27V//3499dRTKl26tNq3b2/1Nd7u4sWLOnv2rH777TetX79ekZGR2rVrl95++205Ojrm+XgAAPsgUAPIF7Vq1dKsWbM0bdo0Va9eXStXrtTUqVOzdW7fvn1VuXJl1a9fXyVLltSOHTsyHVO6dGnFxcVp1KhR8vf3V2xsbJZ9LVmyRPXq1VO7du0UEREhwzD0xRdfZFrmkRciIyMVGBioGjVqaNSoUQoPD9dPP/1kvsUfAKBoMBl5tTAQAAAAuAcxQw0AAABYgUANAAAAWIFADQAAAFiBQA0AAABYgUANAAAAWIFADQAAAFiBQA0AAABYgUANAAAAWIFADQAAAFiBQA0AAABYgUANAAAAWIFADQAAAFjh/wNDLA/3AnNA0AAAAABJRU5ErkJggg==",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "fig, ax, df = plot_label_distributions(\n",
+ " partitioner,\n",
+ " label_name=\"label\",\n",
+ " plot_type=\"heatmap\",\n",
+ " size_unit=\"absolute\",\n",
+ " partition_id_axis=\"x\",\n",
+ " legend=True,\n",
+ " verbose_labels=True,\n",
+ " title=\"Per Partition Labels Distribution\",\n",
+ " plot_kwargs={\"annot\": True},\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5167593e67fa3dbb",
+ "metadata": {},
+ "source": [
+ "Note: we used the `plot_kwargs={\"annot\": True}` to add the number directly to the plot."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e2e41273551ac32a",
+ "metadata": {},
+ "source": [
+ "If you are a `pandas` fan, then you might be interested that a similar heatmap can be created with the DataFrame object for visualization in jupyter notebook:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "fcc90b52bfd650cf",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
airplane
\n",
+ "
automobile
\n",
+ "
bird
\n",
+ "
cat
\n",
+ "
deer
\n",
+ "
dog
\n",
+ "
frog
\n",
+ "
horse
\n",
+ "
ship
\n",
+ "
truck
\n",
+ "
\n",
+ "
\n",
+ "
Partition ID
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0
\n",
+ "
817
\n",
+ "
794
\n",
+ "
1462
\n",
+ "
2123
\n",
+ "
432
\n",
+ "
25
\n",
+ "
456
\n",
+ "
384
\n",
+ "
14
\n",
+ "
9
\n",
+ "
\n",
+ "
\n",
+ "
1
\n",
+ "
1416
\n",
+ "
6
\n",
+ "
97
\n",
+ "
5
\n",
+ "
3
\n",
+ "
0
\n",
+ "
3409
\n",
+ "
0
\n",
+ "
3
\n",
+ "
868
\n",
+ "
\n",
+ "
\n",
+ "
2
\n",
+ "
0
\n",
+ "
4
\n",
+ "
11
\n",
+ "
2
\n",
+ "
454
\n",
+ "
3
\n",
+ "
511
\n",
+ "
15
\n",
+ "
84
\n",
+ "
21
\n",
+ "
\n",
+ "
\n",
+ "
3
\n",
+ "
762
\n",
+ "
159
\n",
+ "
1100
\n",
+ "
51
\n",
+ "
120
\n",
+ "
166
\n",
+ "
2
\n",
+ "
1982
\n",
+ "
1351
\n",
+ "
2175
\n",
+ "
\n",
+ "
\n",
+ "
4
\n",
+ "
2
\n",
+ "
43
\n",
+ "
714
\n",
+ "
2
\n",
+ "
19
\n",
+ "
2400
\n",
+ "
425
\n",
+ "
1
\n",
+ "
151
\n",
+ "
477
\n",
+ "
\n",
+ "
\n",
+ "
5
\n",
+ "
67
\n",
+ "
79
\n",
+ "
170
\n",
+ "
25
\n",
+ "
2552
\n",
+ "
477
\n",
+ "
27
\n",
+ "
44
\n",
+ "
590
\n",
+ "
0
\n",
+ "
\n",
+ "
\n",
+ "
6
\n",
+ "
422
\n",
+ "
2
\n",
+ "
4
\n",
+ "
486
\n",
+ "
380
\n",
+ "
92
\n",
+ "
90
\n",
+ "
380
\n",
+ "
50
\n",
+ "
6
\n",
+ "
\n",
+ "
\n",
+ "
7
\n",
+ "
122
\n",
+ "
2811
\n",
+ "
597
\n",
+ "
2174
\n",
+ "
1038
\n",
+ "
1727
\n",
+ "
1
\n",
+ "
682
\n",
+ "
515
\n",
+ "
4
\n",
+ "
\n",
+ "
\n",
+ "
8
\n",
+ "
256
\n",
+ "
29
\n",
+ "
342
\n",
+ "
75
\n",
+ "
1
\n",
+ "
84
\n",
+ "
8
\n",
+ "
1511
\n",
+ "
2240
\n",
+ "
1417
\n",
+ "
\n",
+ "
\n",
+ "
9
\n",
+ "
1136
\n",
+ "
1073
\n",
+ "
503
\n",
+ "
57
\n",
+ "
1
\n",
+ "
26
\n",
+ "
71
\n",
+ "
1
\n",
+ "
2
\n",
+ "
23
\n",
+ "
\n",
+ " \n",
+ "
\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": null,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.style.background_gradient(axis=None, cmap=\"Greens\", vmin=0)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "37d85e1b40d54918",
+ "metadata": {},
+ "source": [
+ "## Plot Comparison of Label Distributions"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4f49259a3de7dd17",
+ "metadata": {},
+ "source": [
+ "Now, once you know how to visualize a single partitioned dataset, you'll learn how to compare a few of them on a single plot.\n",
+ "\n",
+ "Let's compare:\n",
+ "\n",
+ "- IidPartitioner,\n",
+ "- DirichletPartitioner,\n",
+ "- ShardPartitioner\n",
+ "still using the `cifar10` dataset.\n",
+ "\n",
+ "We need to create a list of partitioners. Each partitioner needs to have a dataset assigned to it (it does not have to be the same dataset so you can also compare the same partitioning on different datasets)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9e84a9192a266f3e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from flwr_datasets import FederatedDataset\n",
+ "from flwr_datasets.partitioner import (\n",
+ " IidPartitioner,\n",
+ " DirichletPartitioner,\n",
+ " ShardPartitioner,\n",
+ ")\n",
+ "\n",
+ "partitioner_list = []\n",
+ "title_list = [\"IidPartitioner\", \"DirichletPartitioner\", \"ShardPartitioner\"]\n",
+ "\n",
+ "## IidPartitioner\n",
+ "fds = FederatedDataset(\n",
+ " dataset=\"cifar10\",\n",
+ " partitioners={\n",
+ " \"train\": IidPartitioner(num_partitions=10),\n",
+ " },\n",
+ ")\n",
+ "partitioner_list.append(fds.partitioners[\"train\"])\n",
+ "\n",
+ "## DirichletPartitioner\n",
+ "fds = FederatedDataset(\n",
+ " dataset=\"cifar10\",\n",
+ " partitioners={\n",
+ " \"train\": DirichletPartitioner(\n",
+ " num_partitions=10,\n",
+ " partition_by=\"label\",\n",
+ " alpha=1.0,\n",
+ " min_partition_size=0,\n",
+ " ),\n",
+ " },\n",
+ ")\n",
+ "partitioner_list.append(fds.partitioners[\"train\"])\n",
+ "\n",
+ "## ShardPartitioner\n",
+ "fds = FederatedDataset(\n",
+ " dataset=\"cifar10\",\n",
+ " partitioners={\n",
+ " \"train\": ShardPartitioner(\n",
+ " num_partitions=10, partition_by=\"label\", num_shards_per_partition=2\n",
+ " )\n",
+ " },\n",
+ ")\n",
+ "partitioner_list.append(fds.partitioners[\"train\"])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d18bae80",
+ "metadata": {},
+ "source": [
+ "Now let's visualize them side by side"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f2ee2864",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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+7wm9ml10URu6LKSlNfiv58hsjTwS4HU5vALzf1+JfVp5zRf2yFQKcczlURERERERKQyFpVERERERESkMhaVREREREREpDKdKypfvHiB4OBgODk5wcTEBM2aNcPFixe1HRYREREREVGZpHNF5dChQ3H06FFs3LgRN27cQNu2beHn54fHj/mgBSIiIiIiouKmU0Vleno6du7cifnz56Nly5Zwd3dHSEgI3N3dER4eru3wiIiIiIiIyhydeqVIVlYWsrOzYWxsrDDexMQEp0+fznOejIwMZGRkyIdTUlI0GiMREREREVFZolNnKi0sLNC0aVPMnj0bT548QXZ2NjZt2oRz587h6dOnec4TFhYGKysr+cfR0bGYoyYiIiIiIiq9dKqoBICNGzdCCIHKlStDKpVi+fLl6Nu3L/T08l6VqVOnIjk5Wf559OhRMUdMRERERERUeunU5a8A4ObmhlOnTiEtLQ0pKSmwt7dH79694erqmmd7qVQKqVRazFESERERERGVDTp3pjKHmZkZ7O3tkZiYiMOHD6Nz587aDomIiIiIiKjM0bkzlYcPH4YQAtWrV8eDBw8wadIkeHp6YtCgQdoOjYiIiIiIqMzRuTOVycnJGDNmDDw9PTFgwAC0aNEChw8fhqGhobZDIyIiIiIiKnN07kxlr1690KtXL22HQURERERERNDBM5VERERERERUckiEEELbQRSnlJQUWFlZITk5GZaWltoOh6hM0HTeMa+Jip8m8445TVT8mHf0PnimkoiIiIiIiFTGopKIiIiIiIhUxqKSiIiIiIiIVMaikoiIiIiIiFTGopKIiIiIiIhUxqKSiIiIiIiIVMaikoiIiIiIiFTGopKIiIiIiIhUxqKSiIiIiIiIVMaikoiIiIiIiFTGopKIiIiIiIhUxqKSiIiIiIiIVMaikoiIiIiIiFTGopKIiIiIiIhUxqKSiIiIiIiIVMaikoiIiIiIiFRmoO0AtGWbVQOYQl+tfTb2Vv/XWcXPSe19AoC0TTW19iep00Ct/SWYqLU7uSvxN9XaX2Rcolr7A4Bd9/5Te585Yi49Vmt/Ivy8Wvt7X9EfecNcX7m8Liy31J0j2qZKjiaYqD9nNEETeahp6s5zdeZ2ScprTfyuJvX66nsvbYdASvhryE5th0ClHM9UEhERERERkcpYVBIREREREZHKWFQSERERERGRylhUEhERERERkcp0qqjMzs7G9OnT4eLiAhMTE7i5uWH27NkQQmg7NCIiIiIiojJJp57+Om/ePISHh2PDhg2oVasWLl26hEGDBsHKygrjxo3TdnhERERERERljk4VlWfPnkXnzp3Rvn17AICzszN+/vln/PHHH1qOjIiIiIiIqGzSqctfmzVrhmPHjuHevXsAgOvXr+P06dMICAjId56MjAykpKQofIiIiIiIiEg9dOpM5RdffIGUlBR4enpCX18f2dnZmDt3Lvr375/vPGFhYQgNDS3GKImIiIiIiMoOnSoqt23bhs2bN+Onn35CrVq1cO3aNQQHB8PBwQEDBw7Mc56pU6diwoQJ8uGUlBQ4OjoWV8hERERERDotOzsbr1+/1nYYVIz09fVhYGAAiUSiVHudKionTZqEL774An369AEA1K5dGw8fPkRYWFi+RaVUKoVUKi3OMImIiIiISoXU1FT8/ffffNtCGWRqagp7e3sYGRkV2lanisqXL19CT0/xNlB9fX3IZDItRUREREREVDplZ2fj77//hqmpKWxtbZU+a0W6TQiBzMxMJCQkICYmBh4eHrlqsHfpVFHZsWNHzJ07F1WrVkWtWrVw9epVLF68GIMHD9Z2aEREREREpcrr168hhICtrS1MTEy0HQ4VIxMTExgaGuLhw4fIzMyEsbFxge11qqhcsWIFpk+fjtGjRyM+Ph4ODg4YMWIEZsyYoe3QiIiIiIhKJZ6hLJsKOzv5Np0qKi0sLLB06VIsXbpU26EQERERERERdOw9lURERERERFSySEQZe5RTSkoKrKyskJycDEtLS22HQ1QmaDrvmNdExU+TececJip+eeXdq1evEBMTAxcXl0LvqdN169evR3BwMJKSkt6rH4lEgt27d6NLly5qiUubirL9eaaSiIiIiIh0XmBgYKko5nQRi0oiIiIiIiJSGYtKIiIiIiIq1RYvXozatWvDzMwMjo6OGD16NFJTU3O127NnDzw8PGBsbAx/f388evRIYfrevXvRoEEDGBsbw9XVFaGhocjKyspzmZmZmQgKCoK9vT2MjY3h5OSEsLAwjayftrGoJCIiIiKiUk1PTw/Lly/HrVu3sGHDBhw/fhyTJ09WaPPy5UvMnTsXP/74I86cOYOkpCT06dNHPv3333/HgAED8Nlnn+H27dtYs2YN1q9fj7lz5+a5zOXL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uqKw40BJyuuE9J/xylADvwhIbSpO4P1kuqAk5XVxuHDhAo4dO4a2bdvCzs4OFy5cQEJCAmrUqIE///xTpT63b9+ORo0aoUWLFti8eTP++OMPrFu3Ts2R664yW1QSEREREVHR/TVkp7ZDKJClpSV+++03LF26FCkpKXBycsKiRYsQEBCArVu3qtRnaGgotmzZgtGjR8Pe3h4///wzatasqebIdReLSiIiIiIiKjVq1KiBQ4cO5Tktr1eHvP1OSgCIjY3N1cbBwQFHjhxRQ3SlE++pJCIiIiIiIpWxqCQiIiIiIiKV6VxR+fjxY3zyySewsbGBiYkJateujUuXLmk7LCIiIiIiKoWEEOjSpYu2wyjRdOqeysTERDRv3hwffvghDh48CFtbW9y/fx/lypXTdmhERERERERlkk4VlfPmzYOjoyMiIiLk41xcXAqcJyMjAxkZGfLhlJQUjcVHRERERERU1ujU5a+//PILGjVqhJ49e8LOzg7169fH2rVrC5wnLCwMVlZW8o+jo2MxRUtERERERFT66VRR+ddffyE8PBweHh44fPgwRo0ahXHjxmHDhg35zjN16lQkJyfLP48ePSrGiImIiIiIiEo3nbr8VSaToVGjRvj6668BAPXr18fNmzexevVqDBw4MM95pFIppFJpcYZJRERERERUZujUmUp7e3vUrFlTYVyNGjUQFxenpYiIiIiIiIjKNp06U9m8eXNERUUpjLt37x6cnJy0FBERERERUdky8fdhxbq8hT4FP0PlXa1atUK9evWwdOlSzQREuejUmcrx48fj/Pnz+Prrr/HgwQP89NNP+O677zBmzBhth0ZERERERFQm6VRR2bhxY+zevRs///wzvLy8MHv2bCxduhT9+/fXdmhERERERFQKZWZmajuEEk+nikoA6NChA27cuIFXr17hzp07GDaseE+/ExERERFRySaTyTB58mSUL18elSpVQkhIiHxaXFwcOnfuDHNzc1haWqJXr1549uyZfHpISAjq1auH77//Hi4uLjA2NgYA7NixA7Vr14aJiQlsbGzg5+eHtLQ0+Xzff/89atSoAWNjY3h6emLVqlXFtr7apvI9lampqYiNjcWLFy9gYWEBFxcXmJmZqTM2IiIiIiKiItuwYQMmTJiACxcu4Ny5cwgMDETz5s3RunVreUF56tQpZGVlYcyYMejduzdO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VBIREREREZHKWFQSERERERGRylhUEhERERERkcpYVBIREREREZHKWFQSERERERGRylhUEhERERERkcpYVBIREREREZHKWFQSERERERGRylhUEhERERERkcpYVBIREREREZHKWFQSERERERGRylhUEhERERERkcpYVBIREREREZHKWFQSERERERGRylhUEhERERERkcpYVBIREREREZHKDLQdgLZss2oAU+irpa/G3ur/Gqv4Oam1P2mbamrpR1KngVr6eVeCiUa6xZX4mxrpNzIuUSP9AsCue/+pvc+YS4/V3icAiPDzGulXVerMa1Vp4nhQVOo+fqhDUY9Byhxr3ue4kXNsUDWXNZGn2pDXsaEk5bX472eILA39giC1mHTrd22HQEpY6LNW2yFQKcczlURERERERKQyFpVERERERESkMhaVREREREREpDKdLCq//fZbODs7w9jYGE2aNMEff/yh7ZCIiIiIiIjKJJ0rKrdu3YoJEyZg5syZuHLlCurWrQt/f3/Ex8drOzQiIiIiIqIyR+eKysWLF2PYsGEYNGgQatasidWrV8PU1BQ//PCDtkMjIiIiIiIqc3SqqMzMzMTly5fh5+cnH6enpwc/Pz+cO3cuz3kyMjKQkpKi8CEiIiIiIiL10Kmi8t9//0V2djYqVqyoML5ixYr4559/8pwnLCwMVlZW8o+jo2NxhEpERERERFQm6FRRqYqpU6ciOTlZ/nn06JG2QyIiIiIiIio1DLQdQFFUqFAB+vr6ePbsmcL4Z8+eoVKlSnnOI5VKIZVKiyM8IiIiIiKiMkenzlQaGRmhYcOGOHbsmHycTCbDsWPH0LRpUy1GRkREREREVDbp1JlKAJgwYQIGDhyIRo0awdvbG0uXLkVaWhoGDRqk7dCIiIiIiIjKHJ0rKnv37o2EhATMmDED//zzD+rVq4dDhw7lengPERERERERaZ7OFZUAEBQUhKCgIG2HQUREREREVObp1D2VREREREREVLKwqCQiIiIiIiKVSYQQQttBFKeUlBRYWVkhOTkZlpaW2g6HqEzQdN4xr4mKnybzjjlNVPyYd/Q+eKaSiIiIiIiIVMaikoiIiIiIiFTGopKIiIiIiIhUxqKSiIiIiIiIVMaikoiIiIiIiFTGopKIiIiIiIhUZqDtAIpbzhtUUlJStBwJUdmRk2+aeoMR85qo+Gkyr5nTRMVP07+rqXQrc0Xl8+fPAQCOjo5ajoSo7Hnx4gWsrKzU3i/zmkh7NJHXzGki7dHU72oq3cpcUVm+fHkAQFxcXKlImJSUFDg6OuLRo0el5kW1XCfdUJR1EkLgxYsXcHBw0EgszOuSj+ukG0pKXpe2nAa4v+iKsrxOmv5dTaVbmSsq9fTe3EZqZWVVag4WAGBpaVmq1gfgOukKZddJk38YMq91B9dJN2g7r0trTgNle3/RJWV1nUrLP3Go+PFBPURERERERKQyFpVERERERESksjJXVEqlUsycORNSqVTboahFaVsfgOukK0rSOpWkWNShtK0PwHXSFSVlnUpKHOrEddINXCci1UgEnxtMREREREREKipzZyqJiIiIiIhIfVhUEhERERERkcpYVBIREREREZHKWFQSERERERGRyspUUfntt9/C2dkZxsbGaNKkCf744w9th6S0sLAwNG7cGBYWFrCzs0OXLl0QFRWl0KZVq1aQSCQKn5EjR2op4sKFhITkitfT01M+/dWrVxgzZgxsbGxgbm6O7t2749mzZ1qMuHDOzs651kkikWDMmDEASv42+u2339CxY0c4ODhAIpFgz549CtOFEJgxYwbs7e1hYmICPz8/3L9/X6HNf//9h/79+8PS0hLW1tYYMmQIUlNTNRYz87pkYV6XvG3EvC5epS2vmdMlc/voYl5T6VZmisqtW7diwoQJmDlzJq5cuYK6devC398f8fHx2g5NKadOncKYMWNw/vx5HD16FK9fv0bbtm2Rlpam0G7YsGF4+vSp/DN//nwtRaycWrVqKcR7+vRp+bTx48fj119/xfbt23Hq1Ck8efIE3bp102K0hbt48aLC+hw9ehQA0LNnT3mbkryN0tLSULduXXz77bd5Tp8/fz6WL1+O1atX48KFCzAzM4O/vz9evXolb9O/f3/cunULR48exb59+/Dbb79h+PDhGomXeV0yMa9L1jZiXhev0pjXzOmSt310La+pDBBlhLe3txgzZox8ODs7Wzg4OIiwsDAtRqW6+Ph4AUCcOnVKPs7X11d89tln2guqiGbOnCnq1q2b57SkpCRhaGgotm/fLh93584dAUCcO3eumCJ8f5999plwc3MTMplMCKFb2wiA2L17t3xYJpOJSpUqiQULFsjHJSUlCalUKn7++WchhBC3b98WAMTFixflbQ4ePCgkEol4/Pix2mNkXpc8zOuSjXld/HQ9r5nTJZ8u5DWVfmXiTGVmZiYuX74MPz8/+Tg9PT34+fnh3LlzWoxMdcnJyQCA8uXLK4zfvHkzKlSoAC8vL0ydOhUvX77URnhKu3//PhwcHODq6or+/fsjLi4OAHD58mW8fv1aYZt5enqiatWqOrPNMjMzsWnTJgwePBgSiUQ+Xte2UY6YmBj8888/CtvEysoKTZo0kW+Tc+fOwdraGo0aNZK38fPzg56eHi5cuKDWeJjXJRfzuuRvoxzMa80rDXnNnC7Z2+ddJS2vqWww0HYAxeHff/9FdnY2KlasqDC+YsWKuHv3rpaiUp1MJkNwcDCaN28OLy8v+fh+/frByckJDg4O+PPPPzFlyhRERUVh165dWow2f02aNMH69etRvXp1PH36FKGhofDx8cHNmzfxzz//wMjICNbW1grzVKxYEf/88492Ai6iPXv2ICkpCYGBgfJxuraN3pbzveeVRznT/vnnH9jZ2SlMNzAwQPny5dW+3ZjXJXOfYV6X/G30Nua1ZpWGvGZOl+ztk5eSltdUNpSJorK0GTNmDG7evKlwTwMAhevga9euDXt7e7Ru3RrR0dFwc3Mr7jALFRAQIP+5Tp06aNKkCZycnLBt2zaYmJhoMTL1WLduHQICAuDg4CAfp2vbiIoP81o3MK+pKEpDXjOnS/b2ISopysTlrxUqVIC+vn6up5E9e/YMlSpV0lJUqgkKCsK+fftw4sQJVKlSpcC2TZo0AQA8ePCgOEJ7b9bW1qhWrRoePHiASpUqITMzE0lJSQptdGWbPXz4EJGRkRg6dGiB7XRpG+V87wXlUaVKlXI9TCMrKwv//fef2rcb87rk7zMA87qkY15rTmnNa+Z0yVfS8prKhjJRVBoZGaFhw4Y4duyYfJxMJsOxY8fQtGlTLUamPCEEgoKCsHv3bhw/fhwuLi6FznPt2jUAgL29vYajU4/U1FRER0fD3t4eDRs2hKGhocI2i4qKQlxcnE5ss4iICNjZ2aF9+/YFttOlbeTi4oJKlSopbJOUlBRcuHBBvk2aNm2KpKQkXL58Wd7m+PHjkMlk8l/K6sK8Lvn7DMC8LumY1+pX2vOaOV3ylbS8pjJCyw8KKjZbtmwRUqlUrF+/Xty+fVsMHz5cWFtbi3/++UfboSll1KhRwsrKSpw8eVI8ffpU/nn58qUQQogHDx6IWbNmiUuXLomYmBixd+9e4erqKlq2bKnlyPP3+eefi5MnT4qYmBhx5swZ4efnJypUqCDi4+OFEEKMHDlSVK1aVRw/flxcunRJNG3aVDRt2lTLURcuOztbVK1aVUyZMkVhvC5soxcvXoirV6+Kq1evCgBi8eLF4urVq+Lhw4dCCCG++eYbYW1tLfbu3Sv+/PNP0blzZ+Hi4iLS09PlfbRr107Ur19fXLhwQZw+fVp4eHiIvn37aiRe5nXJw7wueduIeV28SlteM6dL5vbRtbym0q/MFJVCCLFixQpRtWpVYWRkJLy9vcX58+e1HZLSAOT5iYiIEEIIERcXJ1q2bCnKly8vpFKpcHd3F5MmTRLJycnaDbwAvXv3Fvb29sLIyEhUrlxZ9O7dWzx48EA+PT09XYwePVqUK1dOmJqaiq5du4qnT59qMWLlHD58WAAQUVFRCuN1YRudOHEiz/1s4MCBQog3jymfPn26qFixopBKpaJ169a51vP58+eib9++wtzcXFhaWopBgwaJFy9eaCxm5nXJwrwueduIeV28SlteM6dL5vbRxbym0k0ihBAaPBFKREREREREpViZuKeSiIiIiIiININFJREREREREamMRSURERERERGpjEUlERERERERqYxFJREREREREamMRSURERERERGpjEUlERERERERqYxFJREREREREamMRSURERERERGpjEUlERERERERqYxFJREREREREamMRSURERERERGpjEUlERERERERqYxFJREREREREamMRSURERERERGpjEUlERERERERqYxFJREREREREamMRSURERERERGpjEUlERERERERqYxFJREREREREamMRSURERERERGpjEUlERERERERqYxFJREREREREamMRSURERERERGpjEUlERERERERqYxFJREREREREamMRSURERERERGpjEUlERERERERqYxFJRGRCpydnREYGKjtMJQSEhICiUSiMK644o+NjYVEIsH69evl4wIDA2Fubq7xZeeQSCQICQkptuURERGVNSwqiYjeEh0djREjRsDV1RXGxsawtLRE8+bNsWzZMqSnp2s7PK06cOBAiS3OSnJsREREpZ2BtgMgIiop9u/fj549e0IqlWLAgAHw8vJCZmYmTp8+jUmTJuHWrVv47rvvtB2mWkRFRUFPr2j/Vzxw4AC+/fbbIhVvTk5OSE9Ph6GhYREjLJqCYktPT4eBAX/dERERaQp/yxIRAYiJiUGfPn3g5OSE48ePw97eXj5tzJgxePDgAfbv36/FCNVLKpVqtP+srCzIZDIYGRnB2NhYo8sqjLaXT0REVNrx8lciIgDz589Hamoq1q1bp1BQ5nB3d8dnn32W7/z//fcfJk6ciNq1a8Pc3ByWlpYICAjA9evXc7VdsWIFatWqBVNTU5QrVw6NGjXCTz/9JJ/+4sULBAcHw9nZGVKpFHZ2dmjTpg2uXLlS6HqcPn0ajRs3hrGxMdzc3LBmzZo82717T+Xr168RGhoKDw8PGBsbw8bGBi1atMDRo0cBvLkP8ttvvwXw5h7FnA/wv/smFy5ciKVLl8LNzQ1SqRS3b9/O857KHH/99Rf8/f1hZmYGBwcHzJo1C0II+fSTJ09CIpHg5MmTCvO922dBseWMe/cM5tWrVxEQEABLS0uYm5ujdevWOH/+vEKb9evXQyKR4MyZM5gwYQJsbW1hZmaGrl27IiEhIe8NQEREVAbxTCUREYBff/0Vrq6uaNasmUrz//XXX9izZw969uwJFxcXPHv2DGvWrIGvry9u374NBwcHAMDatWsxbtw49OjRA5999hlevXqFP//8ExcuXEC/fv0AACNHjsSOHTsQFBSEmjVr4vnz5zh9+jTu3LmDBg0a5BvDjRs30LZtW9ja2iIkJARZWVmYOXMmKlasWGj8ISEhCAsLw9ChQ+Ht7Y2UlBRcunQJV65cQZs2bTBixAg8efIER48excaNG/PsIyIiAq9evcLw4cMhlUpRvnx5yGSyPNtmZ2ejXbt2+OCDDzB//nwcOnQIM2fORFZWFmbNmlVovG9TJra33bp1Cz4+PrD8v/buLSTKrY0D+F8nNWfGs5MpmaV51oQEpTxTjJFGgpUSpQhZMKkXhQZRTYkGKVGpSILmTdsKCwwSjyCWKWF0YYZpechDYCKpF+VpZu0Lab6m0bT52hd7+/9dzaxZ61nP+yLCw7vWeq2tkZOTAzMzM5SVlSE6Ohqtra0IDQ3V65+ZmQk7Ozuo1WoMDQ3h1q1byMjIwMOHD38rTyIiov8qFpVEtO7NzMxgbGwMhw4dMjpGYGAg+vr69PYpnjhxAj4+PqioqMClS5cALO3b9Pf3R3V19YqxamtrkZ6ejhs3bujacnJyVs3h8uXLEELg+fPn2Lp1KwAgMTERgYGBq46tra3FgQMHVtwzunv3bnh5eaGpqQnHjx9fts/o6Cg+fPgAhUKhaxsaGlq27+zsLPbv34+ioiIAgEqlwsGDB3H9+nVkZWXB0dFx1Zx/J7cfXbx4EQsLC2hra4O7uzsAICUlBd7e3sjJyUFra6tefwcHBzQ2Nuqefmq1WhQVFWF6eho2NjZrzpOIiOi/istfiWjdm5mZAQBYWVkZHcPCwkJXUGo0GkxOTkIul8Pb21tv2aqtrS1GR0fR2dm5YixbW1u8fPkSnz59WvP8Go0GDQ0NSEhI0BWUAODr64vY2NhVx9va2uLt27d4//79muf8WWJiol5BuZqMjAzdZxMTE2RkZGB+fh7Nzc1G57AajUaDxsZGJCQk6ApKAHB2dsaxY8fQ1tam+3v47tSpU3rLaSMiIqDRaPDx48d/LE8iIqJ/ExaVRLTuWVtbA1jay2gsrVaLmzdvwtPTExYWFnB0dIRCoUBXVxemp6d1/c6fPw+5XI6QkBB4enrizJkzePHihV6sgoICdHd3w9XVFSEhIbhy5QoGBgZ+Of/ExAS+ffsGT09Pg9+8vb1XzT83NxdTU1Pw8vJCYGAgsrOz0dXVtcarX7J9+/Y19zU1NdUr6gDAy8sLwMpPN/+EiYkJfP36ddl74uvrC61Wi5GREb32H4t0ALCzswMAfPny5R/Lk4iI6N+ERSURrXvW1tZwcXFBd3e30TGuXbuGs2fPIjIyEvfu3UNDQwOamprg7++vt6/Q19cXvb29ePDgAcLDw/H48WOEh4dDrVbr+hw9ehQDAwMoLi6Gi4sLCgsL4e/vj7q6uv/rOn8lMjIS/f39uHv3LgICAlBeXo5du3ahvLx8zTEsLS3/aE4/Ph38kUaj+aPzrEYikSzb/uOhQkREROsZi0oiIgDx8fHo7+9HR0eHUeMfPXqEmJgYVFRUIDk5GUqlEvv27cPU1JRBX5lMhqSkJFRWVmJ4eBhxcXHIz8/H7Oysro+zszNUKhVqamowODgIBwcH5Ofnrzi/QqGApaXlsstXe3t713QN9vb2SEtLw/379zEyMoKdO3fqnZq6UpFnDK1Wa/D0ta+vD8DSybTA/54I/nwPl1t2utbcFAoFpFLpsvfk3bt3MDU1haur65piERER0RIWlUREWDoIRyaT4eTJkxgfHzf4vb+/H7dv315xvEQiMXhyVV1djbGxMb22yclJve/m5ubw8/ODEAILCwvQaDR6y2UBYNOmTXBxccHc3Nwv54+NjUVNTQ2Gh4d17T09PWhoaFhx3Ep5yeVy7NixQ29OmUwGwLDIM1ZJSYnusxACJSUlMDMzw969ewEAbm5ukEgkePbsmd640tJSg1hrzU0ikUCpVOLJkyd6y2zHx8dRVVWF8PBw3XJoIiIiWhue/kpEBMDDwwNVVVVISkqCr68vUlJSEBAQgPn5ebS3t6O6ulrvvY4/i4+PR25uLtLS0rBnzx68efMGf/31l8G+QaVSic2bNyMsLAxOTk7o6elBSUkJ4uLiYGVlhampKWzZsgWHDx9GUFAQ5HI5mpub0dnZqXca7HKuXr2K+vp6REREQKVSYXFxUfdOzNX2R/r5+SE6OhrBwcGwt7fHq1evdK81+S44OBgAkJWVhdjYWEgkEiQnJ69yZ5e3ceNG1NfXIzU1FaGhoairq0NtbS0uXLigO+zHxsYGR44cQXFxMUxMTODh4YGnT5/i8+fPBvF+J7e8vDw0NTUhPDwcKpUKGzZsQFlZGebm5lBQUGDU9RAREa1rgoiIdPr6+kR6errYtm2bMDc3F1ZWViIsLEwUFxeL2dlZXT83NzeRmpqq+z47OyvOnTsnnJ2dhaWlpQgLCxMdHR0iKipKREVF6fqVlZWJyMhI4eDgICwsLISHh4fIzs4W09PTQggh5ubmRHZ2tggKChJWVlZCJpOJoKAgUVpauqb8W1tbRXBwsDA3Nxfu7u7izp07Qq1Wi5//3f+cf15enggJCRG2trbC0tJS+Pj4iPz8fDE/P6/rs7i4KDIzM4VCoRAmJia6mIODgwKAKCwsNMjn+2+VlZW6ttTUVCGTyUR/f79QKpVCKpUKJycnoVarhUaj0Rs/MTEhEhMThVQqFXZ2duL06dOiu7vbIOZKuQkhBAChVqv14r5+/VrExsYKuVwupFKpiImJEe3t7Xp9KisrBQDR2dmp197S0iIAiJaWFoPrJSIiWo9MhOBJA0RERERERGQc7qkkIiIiIiIio7GoJCIiIiIiIqOxqCQiIiIiIiKjsagkIiIiIiIio7GoJCIiIiIiIqOxqCQiIiIiIiKjsagkIiIiIiIio7GoJCIiIiIiIqOxqCQiIiIiIiKjsagkIiIiIiIio7GoJCIiIiIiIqOxqCQiIiIiIiKj/Q3rqt/t87q2rwAAAABJRU5ErkJggg==",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "from flwr_datasets.visualization import plot_comparison_label_distribution\n",
+ "\n",
+ "fig, axes, df_list = plot_comparison_label_distribution(\n",
+ " partitioner_list=partitioner_list,\n",
+ " label_name=\"label\",\n",
+ " subtitle=\"Comparison of Partitioning Schemes on CIFAR10\",\n",
+ " titles=title_list,\n",
+ " legend=True,\n",
+ " verbose_labels=True,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "862899eb04695380",
+ "metadata": {},
+ "source": [
+ "## Bonus: Natural Id Dataset"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4f3f8aaf",
+ "metadata": {},
+ "source": [
+ "Nothing stops you from using the `NaturalIdPartitioner` to visualize a dataset with the `id` in it and does not need the artificial partitioning but has the pre-existing partitions. For that dataset, we use `NaturalIdPartitioner`. Let's look at the `speech-commands` dataset that has `speaker_id`, and there are quite a few speakers; therefore, we will show only the first 20 partitions. And since we have quite a few different labels, let's specify `legend_kwargs={\"ncols\": 2}` to display them in two columns (we will also shift the legend slightly to the right)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f016d21a",
+ "metadata": {},
+ "source": [
+ "You'll be using the [Google SpeechCommands](https://huggingface.co/datasets/google/speech_commands) dataset, which is a speech-based dataset. For this, you'll need to install the `\"audio\"` extension for Flower Datasets. It can be easily done like this:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "fd5ca8f4",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "! pip install -q \"flwr-datasets[audio]\""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "90ea3642",
+ "metadata": {},
+ "source": [
+ "With everything ready, let's visualize the partitions for a naturally partitioned dataset."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "4fe70116",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "from flwr_datasets import FederatedDataset\n",
+ "from flwr_datasets.partitioner import NaturalIdPartitioner\n",
+ "from flwr_datasets.visualization import plot_label_distributions\n",
+ "\n",
+ "\n",
+ "fds = FederatedDataset(\n",
+ " dataset=\"google/speech_commands\",\n",
+ " subset=\"v0.01\",\n",
+ " partitioners={\n",
+ " \"train\": NaturalIdPartitioner(\n",
+ " partition_by=\"speaker_id\",\n",
+ " ),\n",
+ " },\n",
+ ")\n",
+ "\n",
+ "partitioner = fds.partitioners[\"train\"]\n",
+ "\n",
+ "fix, ax, df = plot_label_distributions(\n",
+ " partitioner=partitioner,\n",
+ " label_name=\"label\",\n",
+ " max_num_partitions=20,\n",
+ " plot_type=\"bar\",\n",
+ " size_unit=\"percent\",\n",
+ " partition_id_axis=\"x\",\n",
+ " legend=True,\n",
+ " title=\"Per Partition Labels Distribution\",\n",
+ " verbose_labels=True,\n",
+ " legend_kwargs={\"ncols\": 2, \"bbox_to_anchor\": (1.25, 0.5)},\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4442c99c",
+ "metadata": {},
+ "source": [
+ "## More resources\n",
+ "\n",
+ "If you are looking for more resorces, feel free to check:\n",
+ "\n",
+ "* `flwr-dataset` documentation\n",
+ " * [plot_label_distributions](https://flower.ai/docs/datasets/ref-api/flwr_datasets.visualization.plot_label_distributions.html#flwr_datasets.visualization.plot_label_distributions)\n",
+ " * [plot_comparison_label_distribution](https://flower.ai/docs/datasets/ref-api/flwr_datasets.visualization.plot_comparison_label_distribution.html#flwr_datasets.visualization.plot_comparison_label_distribution)\n",
+ "* if you want to do any custom modification of the returned plots\n",
+ " * [matplotlib](https://matplotlib.org/)\n",
+ " * [seaborn](https://seaborn.pydata.org/)\n",
+ " * or plot directly using pandas object [pd.DataFrame.plot](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.html)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "52655972",
+ "metadata": {},
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "flwr",
+ "language": "python",
+ "name": "python3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/datasets/doc/source/index.rst b/datasets/doc/source/index.rst
index df248969a849..bdcea7650bbc 100644
--- a/datasets/doc/source/index.rst
+++ b/datasets/doc/source/index.rst
@@ -7,6 +7,15 @@ learning/analytics/evaluation. It is created by the ``Flower Labs`` team that al
Flower Datasets Framework
-------------------------
+Install
+~~~~~~~
+
+.. code-block:: bash
+
+ python -m pip install "flwr-datasets[vision]"
+
+Check out all the details on how to install Flower Datasets in :doc:`how-to-install-flwr-datasets`.
+
Tutorials
~~~~~~~~~
@@ -32,6 +41,7 @@ Problem-oriented how-to guides show step-by-step how to achieve a specific goal.
how-to-use-with-tensorflow
how-to-use-with-numpy
how-to-use-with-local-data
+ how-to-visualize-label-distribution
how-to-disable-enable-progress-bar
References
@@ -57,9 +67,16 @@ Main features
-------------
Flower Datasets library supports:
-- **downloading datasets** - choose the dataset from Hugging Face's ``dataset``
-- **partitioning datasets** - customize the partitioning scheme
+- **downloading datasets** - choose the dataset from Hugging Face's ``dataset`` (`link `_)
+- **partitioning datasets** - choose one of the implemented partitioning scheme or create your own.
- **creating centralized datasets** - leave parts of the dataset unpartitioned (e.g. for centralized evaluation)
+- **visualization of the partitioned datasets** - visualize the label distribution of the partitioned dataset (and compare the results on different parameters of the same partitioning schemes, different datasets, different partitioning schemes, or any mix of them)
+
+
+.. image:: ./_static/readme/comparison_of_partitioning_schemes.png
+ :align: center
+ :alt: Comparison of Partitioning Schemes on CIFAR10
+
Thanks to using Hugging Face's ``datasets`` used under the hood, Flower Datasets integrates with the following popular formats/frameworks:
@@ -71,28 +88,19 @@ Thanks to using Hugging Face's ``datasets`` used under the hood, Flower Datasets
- Jax
- Arrow
-Install
--------
-
-The simplest install is
-
-.. code-block:: bash
-
- python -m pip install flwr-datasets
-
-If you plan to use the image datasets
-
-.. code-block:: bash
-
- python -m pip install flwr-datasets[vision]
-
-If you plan to use the audio datasets
-
-.. code-block:: bash
+Here are a few of the ``Partitioner`` s that are available: (for a full list see `link `_ )
- python -m pip install flwr-datasets[audio]
+* Partitioner (the abstract base class) ``Partitioner``
+* IID partitioning ``IidPartitioner(num_partitions)``
+* Dirichlet partitioning ``DirichletPartitioner(num_partitions, partition_by, alpha)``
+* InnerDirichlet partitioning ``InnerDirichletPartitioner(partition_sizes, partition_by, alpha)``
+* Natural ID partitioner ``NaturalIdPartitioner(partition_by)``
+* Size partitioner (the abstract base class for the partitioners dictating the division based the number of samples) ``SizePartitioner``
+* Linear partitioner ``LinearPartitioner(num_partitions)``
+* Square partitioner ``SquarePartitioner(num_partitions)``
+* Exponential partitioner ``ExponentialPartitioner(num_partitions)``
+* more to come in the future releases (contributions are welcome).
-Check out the full details on the download in :doc:`how-to-install-flwr-datasets`.
How To Use the library
----------------------
diff --git a/datasets/flwr_datasets/federated_dataset.py b/datasets/flwr_datasets/federated_dataset.py
index bbc6e99b651e..accfb783f368 100644
--- a/datasets/flwr_datasets/federated_dataset.py
+++ b/datasets/flwr_datasets/federated_dataset.py
@@ -36,8 +36,9 @@ class FederatedDataset:
Download, partition data among clients (edge devices), or load full dataset.
- Partitions are created using IidPartitioner. Support for different partitioners
- specification and types will come in future releases.
+ Partitions are created per-split-basis using Partitioners from
+ `flwr_datasets.partitioner` specified in `partitioners` (see `partitioners`
+ parameter for more information).
Parameters
----------
@@ -57,23 +58,43 @@ class FederatedDataset:
into). One or multiple `Partitioner` objects can be specified in that manner,
but at most, one per split.
shuffle : bool
- Whether to randomize the order of samples. Applied prior to resplitting,
- speratelly to each of the present splits in the dataset. It uses the `seed`
- argument. Defaults to True.
+ Whether to randomize the order of samples. Applied prior to preprocessing
+ operations, speratelly to each of the present splits in the dataset. It uses
+ the `seed` argument. Defaults to True.
seed : Optional[int]
Seed used for dataset shuffling. It has no effect if `shuffle` is False. The
- seed cannot be set in the later stages. If `None`, then fresh, unpredictable entropy
- will be pulled from the OS. Defaults to 42.
+ seed cannot be set in the later stages. If `None`, then fresh, unpredictable
+ entropy will be pulled from the OS. Defaults to 42.
Examples
--------
Use MNIST dataset for Federated Learning with 100 clients (edge devices):
- >>> mnist_fds = FederatedDataset(dataset="mnist", partitioners={"train": 100})
+ >>> from flwr_datasets import FederatedDataset
+ >>>
+ >>> fds = FederatedDataset(dataset="mnist", partitioners={"train": 100})
>>> # Load partition for client with ID 10.
- >>> partition = mnist_fds.load_partition(10, "train")
+ >>> partition = fds.load_partition(10)
>>> # Use test split for centralized evaluation.
- >>> centralized = mnist_fds.load_split("test")
+ >>> centralized = fds.load_split("test")
+
+ Use CIFAR10 dataset for Federated Laerning with 100 clients:
+ >>> from flwr_datasets import FederatedDataset
+ >>> from flwr_datasets.partitioner import DirichletPartitioner
+ >>>
+ >>> partitioner = DirichletPartitioner(num_partitions=10, partition_by="label",
+ >>> alpha=0.5, min_partition_size=10)
+ >>> fds = FederatedDataset(dataset="cifar10", partitioners={"train": partitioner})
+ >>> partition = fds.load_partition(partition_id=0)
+
+ Visualize the partitioned datasets
+ >>> from flwr_datasets.visualization import plot_label_distributions
+ >>>
+ >>> _ = plot_label_distributions(
+ >>> partitioner=fds.partitioners["train"],
+ >>> label_name="label",
+ >>> legend=True,
+ >>> )
"""
# pylint: disable=too-many-instance-attributes
diff --git a/datasets/pyproject.toml b/datasets/pyproject.toml
index 56cf3038f4ef..017374181f59 100644
--- a/datasets/pyproject.toml
+++ b/datasets/pyproject.toml
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
[tool.poetry]
name = "flwr-datasets"
-version = "0.1.0"
+version = "0.2.0"
description = "Flower Datasets"
license = "Apache-2.0"
authors = ["The Flower Authors "]
diff --git a/doc/locales/ko/LC_MESSAGES/framework-docs.po b/doc/locales/ko/LC_MESSAGES/framework-docs.po
index 74cb5f00589f..3c41a8647c35 100644
--- a/doc/locales/ko/LC_MESSAGES/framework-docs.po
+++ b/doc/locales/ko/LC_MESSAGES/framework-docs.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Flower main\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-06-17 16:09+0200\n"
-"PO-Revision-Date: 2024-06-22 10:52+0000\n"
+"PO-Revision-Date: 2024-06-23 14:41+0000\n"
"Last-Translator: 박태현 \n"
"Language-Team: Korean \n"
@@ -30,9 +30,11 @@ msgstr "엣지 클라이언트 엔진"
#: ../../source/contributor-explanation-architecture.rst:7
msgid ""
-"`Flower `_ core framework architecture with Edge "
-"Client Engine"
-msgstr "`Flower `_의 핵심 프레임워크 아키텍처와 엣지 클라이언트 엔진"
+"`Flower `_ core framework architecture with Edge Client "
+"Engine"
+msgstr ""
+"`Flower `_의 핵심 프레임워크 아키텍처와 엣지 클라이언트 엔"
+"진"
#: ../../source/contributor-explanation-architecture.rst:13
msgid "Virtual Client Engine"
@@ -42,7 +44,9 @@ msgstr "가상 클라이언트 엔진"
msgid ""
"`Flower `_ core framework architecture with Virtual "
"Client Engine"
-msgstr "`Flower `_의 핵심 프레임워크 아키텍처와 가상 클라이언트 엔진"
+msgstr ""
+"`Flower `_의 핵심 프레임워크 아키텍처와 가상 클라이언트 엔"
+"진"
#: ../../source/contributor-explanation-architecture.rst:21
msgid "Virtual Client Engine and Edge Client Engine in the same workload"
@@ -50,9 +54,11 @@ msgstr "동일 작업에서 가상 클라이언트 엔진과 엣지 클라이언
#: ../../source/contributor-explanation-architecture.rst:23
msgid ""
-"`Flower `_ core framework architecture with both "
-"Virtual Client Engine and Edge Client Engine"
-msgstr "`Flower `_의 핵심 프레임워크 아키텍처와 가상 및 엣지 클라이언트 엔진"
+"`Flower `_ core framework architecture with both Virtual "
+"Client Engine and Edge Client Engine"
+msgstr ""
+"`Flower `_의 핵심 프레임워크 아키텍처와 가상 및 엣지 클라"
+"이언트 엔진"
#: ../../source/contributor-how-to-build-docker-images.rst:2
msgid "How to build Docker Flower images locally"
@@ -60,20 +66,19 @@ msgstr "Docker Flower 이미지를 Locally 구축하는 방법"
#: ../../source/contributor-how-to-build-docker-images.rst:4
msgid ""
-"Flower provides pre-made docker images on `Docker Hub "
-"`_ that include all necessary dependencies"
-" for running the SuperLink, SuperNode or ServerApp. You can also build "
-"your own custom docker images from scratch with a different version of "
-"Python or Linux distribution (Ubuntu/Alpine) if that is what you need. In"
-" this guide, we will explain what images exist and how to build them "
-"locally."
+"Flower provides pre-made docker images on `Docker Hub `_ that include all necessary dependencies for running the "
+"SuperLink, SuperNode or ServerApp. You can also build your own custom docker "
+"images from scratch with a different version of Python or Linux distribution "
+"(Ubuntu/Alpine) if that is what you need. In this guide, we will explain "
+"what images exist and how to build them locally."
msgstr ""
"Flower는 'Docker Hub '_에서 미리 만들어진 "
"Docker 이미지들을 제공합니다. 해당 이미지들은 SuperLink, ServerNode 또는 "
-"ServerApp을 실행하는 데 필요한 모든 dependencies를 포함합니다. 필요한 경우 "
-"다른 버전의 Python이나 Linux 배포판(Ubuntu/Alpine)을 사용해 처음부터 사용자 "
-"정의 Docker 이미지를 빌드할 수도 있습니다. 이 가이드에서는 존재하는 "
-"이미지들과 이들을 로컬에서 빌드하는 방법에 대해 설명하겠습니다."
+"ServerApp을 실행하는 데 필요한 모든 dependencies를 포함합니다. 필요한 경우 다"
+"른 버전의 Python이나 Linux 배포판(Ubuntu/Alpine)을 사용해 처음부터 사용자 정"
+"의 Docker 이미지를 빌드할 수도 있습니다. 이 가이드에서는 존재하는 이미지들과 "
+"이들을 로컬에서 빌드하는 방법에 대해 설명하겠습니다."
#: ../../source/contributor-how-to-build-docker-images.rst:10
msgid ""
@@ -83,7 +88,7 @@ msgstr "시작하기 전에, 로컬 개발 환경에서 몇 가지 전제 조건
#: ../../source/contributor-how-to-build-docker-images.rst:12
msgid "Clone the flower repository."
-msgstr "Flower 리포지토리를 복제합니다."
+msgstr "Flower 레포지토리를 복제합니다."
#: ../../source/contributor-how-to-build-docker-images.rst:18
#: ../../source/how-to-run-flower-using-docker.rst:165
@@ -93,46 +98,45 @@ msgstr "Docker 데몬이 실행 중인지 확인하십시오."
#: ../../source/contributor-how-to-build-docker-images.rst:20
#: ../../source/how-to-run-flower-using-docker.rst:167
msgid ""
-"Please follow the first section on :doc:`Run Flower using Docker ` which covers this step in more detail."
+"Please follow the first section on :doc:`Run Flower using Docker ` which covers this step in more detail."
msgstr ""
-":doc:Run Flower using Docker 의 첫 번째 섹션을 "
-"따라 주십시오. 해당 부분을 더 자세히 설명해 줍니다."
+":doc:Run Flower using Docker 의 첫 번째 섹션"
+"을 따라 주십시오. 해당 부분을 더 자세히 설명해 줍니다."
#: ../../source/contributor-how-to-build-docker-images.rst:25
msgid ""
"The build instructions that assemble the images are located in the "
-"respective Dockerfiles. You can find them in the subdirectories of "
-"``src/docker``."
+"respective Dockerfiles. You can find them in the subdirectories of ``src/"
+"docker``."
msgstr ""
-"이미지들을 조합하는 빌드 instruction들은 해당 Dockerfile에 있습니다. \"src/docker\" 의 하위 "
-"디렉토리에서 찾을 수 있습니다."
+"이미지들을 조합하는 빌드 명령어들은 해당 Dockerfile에 있습니다. \"src/"
+"docker\" 의 하위 디렉토리에서 찾을 수 있습니다."
#: ../../source/contributor-how-to-build-docker-images.rst:28
msgid ""
"Flower Docker images are configured via build arguments. Through build "
-"arguments, we can make the creation of images more flexible. For example,"
-" in the base image, we can specify the version of Python to install using"
-" the ``PYTHON_VERSION`` build argument. Some of the build arguments have "
-"default values, others must be specified when building the image. All "
-"available build arguments for each image are listed in one of the tables "
-"below."
+"arguments, we can make the creation of images more flexible. For example, in "
+"the base image, we can specify the version of Python to install using the "
+"``PYTHON_VERSION`` build argument. Some of the build arguments have default "
+"values, others must be specified when building the image. All available "
+"build arguments for each image are listed in one of the tables below."
msgstr ""
-"Flower Docker는 빌드 argument를 통해 구성됩니다. 빌드 argument들을 통해, "
+"Flower Docker는 빌드 전달인자를 통해 구성됩니다. 빌드 argument들을 통해, "
"이미지를 보다 유연하게 생성할 수 있습니다. 예를 들어, base 이미지에서 "
-"\"PYTHON_VERSION\" 빌드 argument를 사용하여 Python 버전을 지정할 수 "
-"있습니다. 일부 빌드 argument들은 기본값이며, 이미지를 빌드할 때 지정해야 "
-"합니다. 각 이미지에 사용할 수 있는 모든 빌드 argument는 아래 표 중에 "
+"\"PYTHON_VERSION\" 빌드 전달인자를 사용하여 Python 버전을 지정할 수 "
+"있습니다. 일부 빌드 전달인자들은 기본값이며, 이미지를 빌드할 때 지정해야 "
+"합니다. 각 이미지에 사용할 수 있는 모든 빌드 전달인자는 아래 표 중에 "
"있습니다."
#: ../../source/contributor-how-to-build-docker-images.rst:35
msgid "Building the base image"
-msgstr "base 이미지 빌드"
+msgstr "기본 이미지 빌드"
#: ../../source/contributor-how-to-build-docker-images.rst:41
#: ../../source/contributor-how-to-build-docker-images.rst:98
msgid "Build argument"
-msgstr "빌드 argument"
+msgstr "빌드 전달인자"
#: ../../source/contributor-how-to-build-docker-images.rst:42
#: ../../source/contributor-how-to-build-docker-images.rst:99
@@ -155,7 +159,7 @@ msgstr "``DISTRO``"
#: ../../source/contributor-how-to-build-docker-images.rst:46
msgid "The Linux distribution to use as the base image."
-msgstr "base 이미지 사용을 위한 Linux 배포판."
+msgstr "기본 이미지 사용을 위한 Linux 배포판."
#: ../../source/contributor-how-to-build-docker-images.rst:47
#: ../../source/contributor-how-to-build-docker-images.rst:51
@@ -250,20 +254,21 @@ msgstr "``flwr`` 또는 ``flwr-nightly``"
#: ../../source/contributor-how-to-build-docker-images.rst:75
msgid ""
-"The following example creates a base Ubuntu/Alpine image with Python "
-"3.11.0, pip 23.0.1, setuptools 69.0.2 and Flower 1.8.0:"
+"The following example creates a base Ubuntu/Alpine image with Python 3.11.0, "
+"pip 23.0.1, setuptools 69.0.2 and Flower 1.8.0:"
msgstr ""
-"다음 예시에서는 Python 3.11.0, pip 23.0.1, setuptools 및 Flower 1.8.0으로 "
-"기본 Ubuntu/Alpine 이미지를 만듭니다:"
+"다음 예시에서는 Python 3.11.0, pip 23.0.1, setuptools 및 Flower 1.8.0으로 기"
+"본 Ubuntu/Alpine 이미지를 만듭니다:"
#: ../../source/contributor-how-to-build-docker-images.rst:88
msgid ""
-"The name of image is ``flwr_base`` and the tag ``0.1.0``. Remember that "
-"the build arguments as well as the name and tag can be adapted to your "
-"needs. These values serve as examples only."
+"The name of image is ``flwr_base`` and the tag ``0.1.0``. Remember that the "
+"build arguments as well as the name and tag can be adapted to your needs. "
+"These values serve as examples only."
msgstr ""
-"이미지의 이름은 ``flwr_base``이고 태그는 ``0.1.0``입니다. 필요에 따라 빌드 argument들 뿐만 아니라 이름과"
-" 태그도 정할 수 있습니다. 이 값들은 예시일 뿐입니다."
+"이미지의 이름은 ``flwr_base``이고 태그는 ``0.1.0``입니다. 필요에 따라 빌드 "
+"전달인자들 뿐만 아니라 이름과 태그도 정할 수 있습니다. 이 값들은 예시일 "
+"뿐입니다."
#: ../../source/contributor-how-to-build-docker-images.rst:92
msgid "Building the SuperLink/SuperNode or ServerApp image"
@@ -275,7 +280,7 @@ msgstr "``BASE_REPOSITORY``"
#: ../../source/contributor-how-to-build-docker-images.rst:103
msgid "The repository name of the base image."
-msgstr "base 이미지의 리포지토리 이름."
+msgstr "기본 이미지의 레포지토리 이름."
#: ../../source/contributor-how-to-build-docker-images.rst:105
msgid "``flwr/base``"
@@ -295,19 +300,19 @@ msgstr "``1.8.0-py3.10-ubuntu22.04``"
#: ../../source/contributor-how-to-build-docker-images.rst:111
msgid ""
-"The following example creates a SuperLink/SuperNode or ServerApp image "
-"with the official Flower base image:"
-msgstr "다음 예시에서는 공식 Flower 기본 이미지로 SuperLink/SuperNode 또는 "
-"ServerApp이미지를 만듭니다:"
+"The following example creates a SuperLink/SuperNode or ServerApp image with "
+"the official Flower base image:"
+msgstr ""
+"다음 예시에서는 공식 Flower 기본 이미지로 SuperLink/SuperNode 또는 ServerApp"
+"이미지를 만듭니다:"
#: ../../source/contributor-how-to-build-docker-images.rst:122
msgid ""
-"If you want to use your own base image instead of the official Flower "
-"base image, all you need to do is set the ``BASE_REPOSITORY`` build "
-"argument."
+"If you want to use your own base image instead of the official Flower base "
+"image, all you need to do is set the ``BASE_REPOSITORY`` build argument."
msgstr ""
"공식 Flower 기본 이미지 대신 자체 기본 이미지를 사용 하길 원한다면, "
-"``BASE_REPOSITORY`` 빌드 argument들을 설정해야 합니다."
+"``BASE_REPOSITORY`` 빌드 전달인자들을 설정해야 합니다."
#: ../../source/contributor-how-to-build-docker-images.rst:133
msgid "After creating the image, we can test whether the image is working:"
@@ -319,29 +324,30 @@ msgstr "번역 기여"
#: ../../source/contributor-how-to-contribute-translations.rst:4
msgid ""
-"Since `Flower 1.5 `_ we have introduced translations to "
-"our doc pages, but, as you might have noticed, the translations are often"
-" imperfect. If you speak languages other than English, you might be able "
-"to help us in our effort to make Federated Learning accessible to as many"
-" people as possible by contributing to those translations! This might "
-"also be a great opportunity for those wanting to become open source "
-"contributors with little prerequisites."
-msgstr ""
-"`Flower 1.5 `_ 부터 문서 페이지에 번역을 도입했지만, 아시다시피 번역이 불안전한 "
-"경우가 많습니다. 만일 영어 이외의 언어를 사용한다면, 많은 사람들이 Federated Learning에 접근할 수 있도록 번역 "
-"작업에 기여함으로써 저희의 노력에 도움을 주실 수 있습니다! 이는 전제 조건이 거의 없는 오픈 소스 기여자가 되고자 하는 사람들에게"
-" 좋은 기회가 될 수도 있습니다."
+"Since `Flower 1.5 `_ we have introduced translations to our doc pages, "
+"but, as you might have noticed, the translations are often imperfect. If you "
+"speak languages other than English, you might be able to help us in our "
+"effort to make Federated Learning accessible to as many people as possible "
+"by contributing to those translations! This might also be a great "
+"opportunity for those wanting to become open source contributors with little "
+"prerequisites."
+msgstr ""
+"`Flower 1.5 `_ 부터 문서 페이지에 번역을 도입했지만, 아시다시피 "
+"번역이 불안전한 경우가 많습니다. 만일 영어 이외의 언어를 사용한다면, 많은 "
+"사람들이 연합 학습에 접근할 수 있도록 번역 작업에 기여함으로써 저희의 노력에 "
+"도움을 주실 수 있습니다! 이는 전제 조건이 거의 없는 오픈 소스 기여자가 "
+"되고자 하는 사람들에게 좋은 기회가 될 수도 있습니다."
#: ../../source/contributor-how-to-contribute-translations.rst:13
msgid ""
-"Our translation project is publicly available over on `Weblate "
-"`_, this "
-"where most of the work will happen."
+"Our translation project is publicly available over on `Weblate `_, this where most of "
+"the work will happen."
msgstr ""
-"번역 프로젝트는 `Weblate `_에서 공개적으로 진행되며, 대부분의 작업이 이곳에서 이루어집니다."
+"번역 프로젝트는 `Weblate `_에서 공개적으로 진행되며, 대부분의 작업이 이곳에서 이루어집니다."
#: ../../source/contributor-how-to-contribute-translations.rst:18
msgid "Contribute to existing languages"
@@ -349,43 +355,43 @@ msgstr "기존 언어에 기여하기"
#: ../../source/contributor-how-to-contribute-translations.rst:23
msgid ""
-"The first thing you will need to do in order to contribute is to create a"
-" free Weblate account on this `page "
-"`_. More information about"
-" profile settings can be found `here "
+"The first thing you will need to do in order to contribute is to create a "
+"free Weblate account on this `page `_. More information about profile settings can be found `here "
"`_."
msgstr ""
-"기여를 하기 위해 가장 먼저 해야 할 일은 해당 `page "
-"`_에서 무료 Weblate 계정을 만드는 "
-"것입니다. 프로필 설정에 대한 자세한 정보는 `here "
-"`_를 참조하세요."
+"기여를 하기 위해 가장 먼저 해야 할 일은 해당 `page `_에서 무료 Weblate 계정을 만드는 것입니다. 프로필 설"
+"정에 대한 자세한 정보는 `here `_를 참조하세요."
#: ../../source/contributor-how-to-contribute-translations.rst:29
msgid ""
-"Once you are signed in to Weblate, you can navigate to the `Flower "
-"Framework project `_. Here, you should see the different existing languages"
-" that can be found on the website."
+"Once you are signed in to Weblate, you can navigate to the `Flower Framework "
+"project `_. "
+"Here, you should see the different existing languages that can be found on "
+"the website."
msgstr ""
-"Weblate에 로그인한 후, `Flower Framework project "
-"`_로 이동할 수 "
-"있습니다. 여기에서 웹사이트에 있는 다양한 기존 언어들을 확인할 수 있습니다."
+"Weblate에 로그인한 후, `Flower Framework project `_로 이동할 수 있습니다. 여기에서 웹사이트에 "
+"있는 다양한 기존 언어들을 확인할 수 있습니다."
#: ../../source/contributor-how-to-contribute-translations.rst:34
msgid ""
-"Once you have selected the language you want to contribute to, you should"
-" see a similar interface to this:"
+"Once you have selected the language you want to contribute to, you should "
+"see a similar interface to this:"
msgstr "기여하고자 하는 언어를 선택하면, 다음과 같은 인터페이스가 나타납니다:"
#: ../../source/contributor-how-to-contribute-translations.rst:39
msgid ""
"The most straight forward option here is to click on the ``Translate`` "
-"button on the top right (in the ``Translation status`` section). This "
-"will automatically bring you to the translation interface for "
-"untranslated strings."
+"button on the top right (in the ``Translation status`` section). This will "
+"automatically bring you to the translation interface for untranslated "
+"strings."
msgstr ""
-"여기서 가장 간단한 옵션은 오른쪽 상단(``Translation status`` 부분)에 있는 ``Translate`` 버튼을 "
-"클릭하는 것 입니다. 번역되지 않은 문장에 대한 번역 인터페이스로 자동으로 이동합니다."
+"여기서 가장 간단한 옵션은 오른쪽 상단(``Translation status`` 부분)에 있는 "
+"``Translate`` 버튼을 클릭하는 것 입니다. 번역되지 않은 문장에 대한 번역 인터"
+"페이스로 자동으로 이동합니다."
#: ../../source/contributor-how-to-contribute-translations.rst:43
msgid "This is what the interface looks like:"
@@ -393,44 +399,47 @@ msgstr "인터페이스는 다음과 같습니다:"
#: ../../source/contributor-how-to-contribute-translations.rst:47
msgid ""
-"You input your translation in the text box at the top and then, once you "
-"are happy with it, you either press ``Save and continue`` (to save the "
-"translation and go to the next untranslated string), ``Save and stay`` "
-"(to save the translation and stay on the same page), ``Suggest`` (to add "
-"your translation to suggestions for other users to view), or ``Skip`` (to"
-" go to the next untranslated string without saving anything)."
+"You input your translation in the text box at the top and then, once you are "
+"happy with it, you either press ``Save and continue`` (to save the "
+"translation and go to the next untranslated string), ``Save and stay`` (to "
+"save the translation and stay on the same page), ``Suggest`` (to add your "
+"translation to suggestions for other users to view), or ``Skip`` (to go to "
+"the next untranslated string without saving anything)."
msgstr ""
-"번역문을 상단의 텍스트 상자에 입력한 후, 번역이 만족스러우면 ``Save and continue``(번역을 저장하고 다음 미번역 "
-"문장으로 이동), ``Save and stay``(번역을 저장하고 해당 페이지에 머무르기), ``Suggest`` (다른 사용자가 "
-"볼 수 있도록 번역을 제안 항목에 추가), ``Skip``(아무것도 저장하지 않고 다음 미번역 문장으로 이동) 중 하나를 선택하면 "
-"됩니다."
+"번역문을 상단의 텍스트 상자에 입력한 후, 번역이 만족스러우면 ``Save and "
+"continue``(번역을 저장하고 다음 미번역 문장으로 이동), ``Save and stay``(번역"
+"을 저장하고 해당 페이지에 머무르기), ``Suggest`` (다른 사용자가 볼 수 있도록 "
+"번역을 제안 항목에 추가), ``Skip``(아무것도 저장하지 않고 다음 미번역 문장으"
+"로 이동) 중 하나를 선택하면 됩니다."
#: ../../source/contributor-how-to-contribute-translations.rst:54
msgid ""
"In order to help with the translations, you can see on the bottom the "
"``Nearby strings``, the ``Comments`` (from other contributors), the "
"``Automatic suggestions`` (from machine translation engines), the "
-"translations in ``Other languages``, and the ``History`` of translations "
-"for this string."
+"translations in ``Other languages``, and the ``History`` of translations for "
+"this string."
msgstr ""
-"번역에 도움을 주기위해 하단에서 `주변 문자열``, ``의견``(다른 기여자의), ``자동 제안``(기계 번역의), ``다른 "
-"언어``의 번역 및 해당 문장의 번역``히스토리``를 볼 수 있습니다."
+"번역에 도움을 주기위해 하단에서 `주변 문자열``, ``의견``(다른 기여자의), ``자"
+"동 제안``(기계 번역의), ``다른 언어``의 번역 및 해당 문장의 번역``히스토리``"
+"를 볼 수 있습니다."
#: ../../source/contributor-how-to-contribute-translations.rst:59
msgid ""
-"On the right, under the ``String information`` section, you can also "
-"click the link under ``Source string location`` in order to view the "
-"source of the doc file containing the string."
-msgstr "오른쪽의 ``문자열 정보``에서 ``원본 문자열 위치``를 클릭하여 해당 문장이 포함된 문서의 파일 소스를 볼 수도 있습니다."
+"On the right, under the ``String information`` section, you can also click "
+"the link under ``Source string location`` in order to view the source of the "
+"doc file containing the string."
+msgstr ""
+"오른쪽의 ``문자열 정보``에서 ``원본 문자열 위치``를 클릭하여 해당 문장이 포함"
+"된 문서의 파일 소스를 볼 수도 있습니다."
#: ../../source/contributor-how-to-contribute-translations.rst:63
msgid ""
-"For more information about translating using Weblate, you can check out "
-"this `in-depth guide "
-"`_."
+"For more information about translating using Weblate, you can check out this "
+"`in-depth guide `_."
msgstr ""
-"Weblate를 통한 번역에 대한 자세한 정보는 `in-depth guide "
-"`_를 확인하세요."
+"Weblate를 통한 번역에 대한 자세한 정보는 `in-depth guide `_를 확인하세요."
#: ../../source/contributor-how-to-contribute-translations.rst:67
msgid "Add new languages"
@@ -438,12 +447,13 @@ msgstr "새 언어 추가"
#: ../../source/contributor-how-to-contribute-translations.rst:69
msgid ""
-"If you want to add a new language, you will first have to contact us, "
-"either on `Slack `_, or by opening an issue"
-" on our `GitHub repo `_."
+"If you want to add a new language, you will first have to contact us, either "
+"on `Slack `_, or by opening an issue on our "
+"`GitHub repo `_."
msgstr ""
-"새 언어를 추가하려면, `Slack `에 문의하거나 `GitHub repo "
-"`_에서 issue에 들어가 문의 해야 합니다."
+"새 언어를 추가하려면, `Slack `에 문의하거나 "
+"`GitHub repo `_에서 issue에 들어가 문의 해야 "
+"합니다."
#: ../../source/contributor-how-to-develop-in-vscode-dev-containers.rst:2
msgid "Develop in VSCode Dev Containers"
@@ -451,49 +461,52 @@ msgstr "VSCode Dev Container에서 개발"
#: ../../source/contributor-how-to-develop-in-vscode-dev-containers.rst:4
msgid ""
-"When working on the Flower framework we want to ensure that all "
-"contributors use the same developer environment to format code or run "
-"tests. For this purpose we are using the VSCode Remote Containers "
-"extension. What is it? Read the following quote:"
+"When working on the Flower framework we want to ensure that all contributors "
+"use the same developer environment to format code or run tests. For this "
+"purpose we are using the VSCode Remote Containers extension. What is it? "
+"Read the following quote:"
msgstr ""
-"Flower 프레임워크 작업시, 모든 기여자들이 코드 포맷팅이나 테스트 실행을 위해 동일한 개발 환경을 사용하길 원합니다. 이를 "
-"위해 VSCode Remote Containers 확장을 사용하고 있습니다. 그것이 무엇인지 알아보기 위해 다음 인용문을 "
-"읽어보세요:"
+"Flower 프레임워크 작업시, 모든 기여자들이 코드 포맷팅이나 테스트 실행을 위해 "
+"동일한 개발 환경을 사용하길 원합니다. 이를 위해 VSCode Remote Containers 확장"
+"을 사용하고 있습니다. 그것이 무엇인지 알아보기 위해 다음 인용문을 읽어보세요:"
#: ../../source/contributor-how-to-develop-in-vscode-dev-containers.rst:7
msgid ""
-"The Visual Studio Code Remote - Containers extension lets you use a "
-"Docker container as a fully-featured development environment. It allows "
-"you to open any folder inside (or mounted into) a container and take "
-"advantage of Visual Studio Code's full feature set. A "
-":code:`devcontainer.json` file in your project tells VS Code how to "
-"access (or create) a development container with a well-defined tool and "
-"runtime stack. This container can be used to run an application or to "
-"separate tools, libraries, or runtimes needed for working with a "
-"codebase."
-msgstr ""
-"Visual Studio Code Remote - 컨테이너 확장을 사용하면 Docker 컨테이너를 모든 기능을 갖춘 개발 환경으로 "
-"사용할 수 있습니다. 이 확장 기능을 사용하면 컨테이너 내부(또는 컨테이너에 마운트된)의 모든 폴더를 열고 Visual Studio"
-" Code의 모든 기능을 활용할 수 있습니다. 프로젝트에 있는 :code:`devcontainer.json` 파일은 잘 정의된 "
-"도구와 런타임 스택을 사용하여 개발 컨테이너에 액세스(또는 생성)하는 방법을 VS Code에 알려줍니다. 이 컨테이너는 "
-"애플리케이션을 실행하거나 코드베이스 작업에 필요한 도구, 라이브러리 또는 런타임을 분리하는 데 사용할 수 있습니다."
+"The Visual Studio Code Remote - Containers extension lets you use a Docker "
+"container as a fully-featured development environment. It allows you to open "
+"any folder inside (or mounted into) a container and take advantage of Visual "
+"Studio Code's full feature set. A :code:`devcontainer.json` file in your "
+"project tells VS Code how to access (or create) a development container with "
+"a well-defined tool and runtime stack. This container can be used to run an "
+"application or to separate tools, libraries, or runtimes needed for working "
+"with a codebase."
+msgstr ""
+"Visual Studio Code Remote - 컨테이너 확장을 사용하면 Docker 컨테이너를 모든 "
+"기능을 갖춘 개발 환경으로 사용할 수 있습니다. 이 확장 기능을 사용하면 컨테이"
+"너 내부(또는 컨테이너에 마운트된)의 모든 폴더를 열고 Visual Studio Code의 모"
+"든 기능을 활용할 수 있습니다. 프로젝트에 있는 :code:`devcontainer.json` 파일"
+"은 잘 정의된 도구와 런타임 스택을 사용하여 개발 컨테이너에 액세스(또는 생성)"
+"하는 방법을 VS Code에 알려줍니다. 이 컨테이너는 애플리케이션을 실행하거나 코"
+"드베이스 작업에 필요한 도구, 라이브러리 또는 런타임을 분리하는 데 사용할 수 "
+"있습니다."
#: ../../source/contributor-how-to-develop-in-vscode-dev-containers.rst:9
msgid ""
-"Workspace files are mounted from the local file system or copied or "
-"cloned into the container. Extensions are installed and run inside the "
-"container, where they have full access to the tools, platform, and file "
-"system. This means that you can seamlessly switch your entire development"
-" environment just by connecting to a different container."
+"Workspace files are mounted from the local file system or copied or cloned "
+"into the container. Extensions are installed and run inside the container, "
+"where they have full access to the tools, platform, and file system. This "
+"means that you can seamlessly switch your entire development environment "
+"just by connecting to a different container."
msgstr ""
-"작업 공간 파일은 로컬 파일 시스템에서 마운트되거나 컨테이너에 복사 또는 클론됩니다. 확장 프로그램은 컨테이너 내부에 설치되고 "
-"실행되며, 도구, 플랫폼 및 파일 시스템에 완전한 접근 권한을 갖습니다. 이는 다른 컨테이너에 연결하는 것만으로 전체 개발 환경을 "
-"원활하게 전환할 수 있음을 의미합니다."
+"작업 공간 파일은 로컬 파일 시스템에서 마운트되거나 컨테이너에 복사 또는 클론"
+"됩니다. 확장 프로그램은 컨테이너 내부에 설치되고 실행되며, 도구, 플랫폼 및 파"
+"일 시스템에 완전한 접근 권한을 갖습니다. 이는 다른 컨테이너에 연결하는 것만으"
+"로 전체 개발 환경을 원활하게 전환할 수 있음을 의미합니다."
#: ../../source/contributor-how-to-develop-in-vscode-dev-containers.rst:11
msgid ""
-"Source: `Official VSCode documentation "
-"`_"
+"Source: `Official VSCode documentation `_"
msgstr "출처 : 공식 VSCode 문서"
#: ../../source/contributor-how-to-develop-in-vscode-dev-containers.rst:15
@@ -502,52 +515,57 @@ msgstr "시작하기"
#: ../../source/contributor-how-to-develop-in-vscode-dev-containers.rst:17
msgid ""
-"Configuring and setting up the :code:`Dockerfile` as well the "
-"configuration for the devcontainer can be a bit more involved. The good "
-"thing is you don't have to do it. Usually it should be enough to install "
-"`Docker `_ on your system and "
-"ensure its available on your command line. Additionally, install the "
-"`VSCode Containers Extension `_."
-msgstr ""
-"`Dockerfile`을 설정하고 구성하는 것과 개발 컨테이너 구성은 약간 복잡할 수 있습니다. 다행히도, 이를 직접 할 필요는 "
-"없습니다. 일반적으로 시스템에 `Docker `_를 "
-"설치하고 커맨드 라인에서 사용할 수 있는지 확인하는 것으로 충분합니다. 추가로 `VSCode Containers Extension "
+"Configuring and setting up the :code:`Dockerfile` as well the configuration "
+"for the devcontainer can be a bit more involved. The good thing is you don't "
+"have to do it. Usually it should be enough to install `Docker `_ on your system and ensure its available on "
+"your command line. Additionally, install the `VSCode Containers Extension "
+"`_."
+msgstr ""
+"`Dockerfile`을 설정하고 구성하는 것과 개발 컨테이너 구성은 약간 복잡할 수 있"
+"습니다. 다행히도, 이를 직접 할 필요는 없습니다. 일반적으로 시스템에 `Docker "
+"`_를 설치하고 커맨드 라인에서 사용"
+"할 수 있는지 확인하는 것으로 충분합니다. 추가로 `VSCode Containers Extension "
"`_을 설치하세요."
#: ../../source/contributor-how-to-develop-in-vscode-dev-containers.rst:19
msgid ""
-"Now you should be good to go. When starting VSCode, it will ask you to "
-"run in the container environment and - if you confirm - automatically "
-"build the container and use it. To manually instruct VSCode to use the "
-"devcontainer, you can, after installing the extension, click the green "
-"area in the bottom left corner of your VSCode window and select the "
-"option *(Re)Open Folder in Container*."
+"Now you should be good to go. When starting VSCode, it will ask you to run "
+"in the container environment and - if you confirm - automatically build the "
+"container and use it. To manually instruct VSCode to use the devcontainer, "
+"you can, after installing the extension, click the green area in the bottom "
+"left corner of your VSCode window and select the option *(Re)Open Folder in "
+"Container*."
msgstr ""
-"이제 준비가 완료되었습니다. VSCode를 시작하면 컨테이너 환경에서 실행할지를 묻고, 확인하면 자동으로 컨테이너를 빌드하고 사용할"
-" 것입니다. VSCode에 수동으로 개발 컨테이너를 사용하도록 지시하려면, 확장을 설치한 후, VSCode 창의 왼쪽 하단에 있는 "
-"초록색 부을 클릭하고 *(Re)Open Folder in Container* 옵션을 선택하세요."
+"이제 준비가 완료되었습니다. VSCode를 시작하면 컨테이너 환경에서 실행할지를 묻"
+"고, 확인하면 자동으로 컨테이너를 빌드하고 사용할 것입니다. VSCode에 수동으로 "
+"개발 컨테이너를 사용하도록 지시하려면, 확장을 설치한 후, VSCode 창의 왼쪽 하"
+"단에 있는 초록색 부을 클릭하고 *(Re)Open Folder in Container* 옵션을 선택하세"
+"요."
#: ../../source/contributor-how-to-develop-in-vscode-dev-containers.rst:21
msgid ""
-"In some cases your setup might be more involved. For those cases consult "
-"the following sources:"
-msgstr "경우에 따라 설정이 더 복잡할 수도 있습니다. 이러한 경우에는 다음 소스를 참조하세요:"
+"In some cases your setup might be more involved. For those cases consult the "
+"following sources:"
+msgstr ""
+"경우에 따라 설정이 더 복잡할 수도 있습니다. 이러한 경우에는 다음 소스를 참조"
+"하세요:"
#: ../../source/contributor-how-to-develop-in-vscode-dev-containers.rst:23
msgid ""
-"`Developing inside a Container "
-"`_"
+"`Developing inside a Container `_"
msgstr ""
-"`컨테이너 내부 개발`_"
+"`컨테이너 내부 개발`_"
#: ../../source/contributor-how-to-develop-in-vscode-dev-containers.rst:24
msgid ""
-"`Remote development in Containers "
-"`_"
-msgstr "`컨테이너 원격 개발`_"
+"`Remote development in Containers `_"
+msgstr ""
+"`컨테이너 원격 개발`_"
#: ../../source/contributor-how-to-install-development-versions.rst:2
msgid "Install development versions"
@@ -563,19 +581,20 @@ msgstr "Poetry 사용하기(권장)"
#: ../../source/contributor-how-to-install-development-versions.rst:10
msgid ""
-"Install a ``flwr`` pre-release from PyPI: update the ``flwr`` dependency "
-"in ``pyproject.toml`` and then reinstall (don't forget to delete "
-"``poetry.lock`` (``rm poetry.lock``) before running ``poetry install``)."
+"Install a ``flwr`` pre-release from PyPI: update the ``flwr`` dependency in "
+"``pyproject.toml`` and then reinstall (don't forget to delete ``poetry."
+"lock`` (``rm poetry.lock``) before running ``poetry install``)."
msgstr ""
-"PyPI에서 ``flwr`` 사전 릴리스 설치하기: ``pyproject.toml``에서 ``flwr``의 dependency를 "
-"업데이트한 다음, 재설치하세요(``poetry 설치``이전에 ``poetry.lock`` (``rm poetry.lock``)를 "
-"제거하는 것을 잊지 마세요)."
+"PyPI에서 ``flwr`` 사전 릴리스 설치하기: ``pyproject.toml``에서 ``flwr``의 "
+"의존성을 업데이트한 다음, 재설치하세요(``poetry 설치``이전에 ``poetry.lock`` "
+"(``rm poetry.lock``)를 제거하는 것을 잊지 마세요)."
#: ../../source/contributor-how-to-install-development-versions.rst:12
msgid ""
"``flwr = { version = \"1.0.0a0\", allow-prereleases = true }`` (without "
"extras)"
-msgstr "``flwr = { version = \"1.0.0a0\", allow-prereleases = true }`` (extras 제외)"
+msgstr ""
+"``flwr = { version = \"1.0.0a0\", allow-prereleases = true }`` (extras 제외)"
#: ../../source/contributor-how-to-install-development-versions.rst:13
msgid ""
@@ -587,9 +606,11 @@ msgstr ""
#: ../../source/contributor-how-to-install-development-versions.rst:15
msgid ""
-"Install ``flwr`` from a local copy of the Flower source code via "
-"``pyproject.toml``:"
-msgstr "``pyproject.toml``을 통해 Flower 소스 코드의 로컬 복사본에서 ``flwr``을 설치하세요:"
+"Install ``flwr`` from a local copy of the Flower source code via ``pyproject."
+"toml``:"
+msgstr ""
+"``pyproject.toml``을 통해 Flower 소스 코드의 로컬 복사본에서 ``flwr``을 설치"
+"하세요:"
#: ../../source/contributor-how-to-install-development-versions.rst:17
msgid "``flwr = { path = \"../../\", develop = true }`` (without extras)"
@@ -597,11 +618,11 @@ msgstr "``flwr = { path = \"../../\", develop = true }`` (extras 제외)"
#: ../../source/contributor-how-to-install-development-versions.rst:18
msgid ""
-"``flwr = { path = \"../../\", develop = true, extras = [\"simulation\"] "
-"}`` (with extras)"
+"``flwr = { path = \"../../\", develop = true, extras = [\"simulation\"] }`` "
+"(with extras)"
msgstr ""
-"``flwr = { path = \"../../\", develop = true, extras = [\"simulation\"] "
-"}`` (extras 포함)"
+"``flwr = { path = \"../../\", develop = true, extras = [\"simulation\"] }`` "
+"(extras 포함)"
#: ../../source/contributor-how-to-install-development-versions.rst:20
msgid "Install ``flwr`` from a local wheel file via ``pyproject.toml``:"
@@ -609,11 +630,11 @@ msgstr "``pyproject.toml``을 통해 로컬 wheel file에서 ``flwr``을 설치
#: ../../source/contributor-how-to-install-development-versions.rst:22
msgid ""
-"``flwr = { path = \"../../dist/flwr-1.8.0-py3-none-any.whl\" }`` (without"
-" extras)"
+"``flwr = { path = \"../../dist/flwr-1.8.0-py3-none-any.whl\" }`` (without "
+"extras)"
msgstr ""
-"``flwr = { path = \"../../dist/flwr-1.8.0-py3-none-any.whl\" }`` (extras "
-"제외)"
+"``flwr = { path = \"../../dist/flwr-1.8.0-py3-none-any.whl\" }`` (extras 제"
+"외)"
#: ../../source/contributor-how-to-install-development-versions.rst:23
msgid ""
@@ -629,8 +650,8 @@ msgid ""
"Dependency Specification `_"
msgstr ""
-"자세한 내용은 Poetry 문서를 참고하세요: `Poetry Dependency Specification `_"
+"자세한 내용은 Poetry 문서를 참고하세요: `Poetry Dependency Specification "
+"`_"
#: ../../source/contributor-how-to-install-development-versions.rst:28
msgid "Using pip (recommended on Colab)"
@@ -638,7 +659,7 @@ msgstr "pip 사용하기(Colab에서 권장)"
#: ../../source/contributor-how-to-install-development-versions.rst:30
msgid "Install a ``flwr`` pre-release from PyPI:"
-msgstr "PyPI에서 ``flwr`` 사전 릴리스를 설치하기:"
+msgstr "PyPI에서 ``flwr`` 사전 릴리즈를 설치하기:"
#: ../../source/contributor-how-to-install-development-versions.rst:32
msgid "``pip install -U --pre flwr`` (without extras)"
@@ -653,8 +674,8 @@ msgid ""
"Python packages can be installed from git repositories. Use one of the "
"following commands to install the Flower directly from GitHub."
msgstr ""
-"Python 패키지는 git 저장소에서 설치할 수 있습니다. 다음 명령어 중 하나를 사용하여 GitHub에서 직접 Flower를 "
-"설치하세요."
+"Python 패키지는 git 저장소에서 설치할 수 있습니다. 다음 명령어 중 하나를 사용"
+"하여 GitHub에서 직접 Flower를 설치하세요."
#: ../../source/contributor-how-to-install-development-versions.rst:37
msgid "Install ``flwr`` from the default GitHub branch (``main``):"
@@ -662,9 +683,9 @@ msgstr "기본 GitHub branch (``main``)에서 ``flwr`` 를 설치하기:"
#: ../../source/contributor-how-to-install-development-versions.rst:39
msgid ""
-"``pip install flwr@git+https://github.com/adap/flower.git`` (without "
-"extras)"
-msgstr "``pip install flwr@git+https://github.com/adap/flower.git`` (extras 제외)"
+"``pip install flwr@git+https://github.com/adap/flower.git`` (without extras)"
+msgstr ""
+"``pip install flwr@git+https://github.com/adap/flower.git`` (extras 제외)"
#: ../../source/contributor-how-to-install-development-versions.rst:40
msgid ""
@@ -688,11 +709,11 @@ msgstr ""
#: ../../source/contributor-how-to-install-development-versions.rst:45
msgid ""
-"``pip install flwr[simulation]@git+https://github.com/adap/flower.git"
-"@branch-name`` (with extras)"
+"``pip install flwr[simulation]@git+https://github.com/adap/flower.git@branch-"
+"name`` (with extras)"
msgstr ""
-"``pip install flwr[simulation]@git+https://github.com/adap/flower.git"
-"@branch-name`` (extras 포함)"
+"``pip install flwr[simulation]@git+https://github.com/adap/flower.git@branch-"
+"name`` (extras 포함)"
#: ../../source/contributor-how-to-install-development-versions.rst:49
msgid "Open Jupyter Notebooks on Google Colab"
@@ -703,32 +724,32 @@ msgid ""
"Open the notebook ``doc/source/tutorial-series-get-started-with-flower-"
"pytorch.ipynb``:"
msgstr ""
-"``doc/source/tutorial-series-get-started-with-flower-"
-"pytorch.ipynb``notebook을 엽니다:"
+"``doc/source/tutorial-series-get-started-with-flower-pytorch.ipynb``notebook"
+"을 엽니다:"
#: ../../source/contributor-how-to-install-development-versions.rst:53
msgid ""
-"https://colab.research.google.com/github/adap/flower/blob/main/doc/source"
-"/tutorial-series-get-started-with-flower-pytorch.ipynb"
+"https://colab.research.google.com/github/adap/flower/blob/main/doc/source/"
+"tutorial-series-get-started-with-flower-pytorch.ipynb"
msgstr ""
-"https://colab.research.google.com/github/adap/flower/blob/main/doc/source"
-"/tutorial-series-get-started-with-flower-pytorch.ipynb"
+"https://colab.research.google.com/github/adap/flower/blob/main/doc/source/"
+"tutorial-series-get-started-with-flower-pytorch.ipynb"
#: ../../source/contributor-how-to-install-development-versions.rst:55
msgid ""
-"Open a development version of the same notebook from branch `branch-name`"
-" by changing ``main`` to ``branch-name`` (right after ``blob``):"
+"Open a development version of the same notebook from branch `branch-name` by "
+"changing ``main`` to ``branch-name`` (right after ``blob``):"
msgstr ""
-"``main``을 ``branch-name``(``blob`` 바로 뒤)으로 변경하여 동일한 notebook의 개발 버전을 브랜치 "
-"`branch-name`에서 엽니다 :"
+"``main``을 ``branch-name``(``blob`` 바로 뒤)으로 변경하여 동일한 notebook의 "
+"개발 버전을 브랜치 `branch-name`에서 엽니다 :"
#: ../../source/contributor-how-to-install-development-versions.rst:57
msgid ""
-"https://colab.research.google.com/github/adap/flower/blob/branch-"
-"name/doc/source/tutorial-series-get-started-with-flower-pytorch.ipynb"
+"https://colab.research.google.com/github/adap/flower/blob/branch-name/doc/"
+"source/tutorial-series-get-started-with-flower-pytorch.ipynb"
msgstr ""
-"https://colab.research.google.com/github/adap/flower/blob/branch-"
-"name/doc/source/tutorial-series-get-started-with-flower-pytorch.ipynb"
+"https://colab.research.google.com/github/adap/flower/blob/branch-name/doc/"
+"source/tutorial-series-get-started-with-flower-pytorch.ipynb"
#: ../../source/contributor-how-to-install-development-versions.rst:59
msgid "Install a `whl` on Google Colab:"
@@ -736,9 +757,11 @@ msgstr "Google Colab에서 `whl` 설치하기:"
#: ../../source/contributor-how-to-install-development-versions.rst:61
msgid ""
-"In the vertical icon grid on the left hand side, select ``Files`` > "
-"``Upload to session storage``"
-msgstr "왼쪽의 수직 아이콘 그리드에서 ``Files`` > ``Upload to session storage``를 선택하세요"
+"In the vertical icon grid on the left hand side, select ``Files`` > ``Upload "
+"to session storage``"
+msgstr ""
+"왼쪽의 수직 아이콘 그리드에서 ``Files`` > ``Upload to session storage``를 선"
+"택하세요"
#: ../../source/contributor-how-to-install-development-versions.rst:62
msgid "Upload the whl (e.g., ``flwr-1.8.0-py3-none-any.whl``)"
@@ -746,13 +769,13 @@ msgstr "whl (예:``flwr-1.8.0-py3-none-any.whl``)을 업로드하세요"
#: ../../source/contributor-how-to-install-development-versions.rst:63
msgid ""
-"Change ``!pip install -q 'flwr[simulation]' torch torchvision "
-"matplotlib`` to ``!pip install -q 'flwr-1.8.0-py3-none-"
-"any.whl[simulation]' torch torchvision matplotlib``"
+"Change ``!pip install -q 'flwr[simulation]' torch torchvision matplotlib`` "
+"to ``!pip install -q 'flwr-1.8.0-py3-none-any.whl[simulation]' torch "
+"torchvision matplotlib``"
msgstr ""
-"``!pip install -q 'flwr[simulation]' torch torchvision matplotlib``를 "
-"``!pip install -q 'flwr-1.8.0-py3-none-any.whl[simulation]' torch "
-"torchvision matplotlib``로 바꾸세요"
+"``!pip install -q 'flwr[simulation]' torch torchvision matplotlib``를 ``!pip "
+"install -q 'flwr-1.8.0-py3-none-any.whl[simulation]' torch torchvision "
+"matplotlib``로 바꾸세요"
#: ../../source/contributor-how-to-release-flower.rst:2
msgid "Release Flower"
@@ -762,7 +785,8 @@ msgstr "Flower 릴리즈 하기"
msgid ""
"This document describes the current release process. It may or may not "
"change in the future."
-msgstr "이 문서는 현재 릴리즈 과정을 설명합니다. 이는 앞으로 변경될 수도 있습니다."
+msgstr ""
+"이 문서는 현재 릴리즈 과정을 설명합니다. 이는 앞으로 변경될 수도 있습니다."
#: ../../source/contributor-how-to-release-flower.rst:7
msgid "During the release"
@@ -770,12 +794,11 @@ msgstr "릴리즈 동안에"
#: ../../source/contributor-how-to-release-flower.rst:9
msgid ""
-"The version number of a release is stated in ``pyproject.toml``. To "
-"release a new version of Flower, the following things need to happen (in "
-"that order):"
+"The version number of a release is stated in ``pyproject.toml``. To release "
+"a new version of Flower, the following things need to happen (in that order):"
msgstr ""
-"릴리즈의 버전 번호는 ``pyproject.toml``에 명시되어 있습니다. Flower의 새 버전을 릴리즈하려면 다음 작업이 "
-"순서대로 수행되어야 합니다:"
+"릴리즈의 버전 번호는 ``pyproject.toml``에 명시되어 있습니다. Flower의 새 버전"
+"을 릴리즈하려면 다음 작업이 순서대로 수행되어야 합니다:"
#: ../../source/contributor-how-to-release-flower.rst:11
msgid ""
@@ -783,39 +806,42 @@ msgid ""
"order to add every new change to the changelog (feel free to make manual "
"changes to the changelog afterwards until it looks good)."
msgstr ""
-"모든 새로운 변경 사항을 변경 로그에 추가하기 위해``python3 "
-"src/py/flwr_tool/update_changelog.py ``을 실행합니다 (변경 로그가 "
-"만족스러워질 때까지 수동으로 변경해도 됩니다)."
+"모든 새로운 변경 사항을 변경 로그에 추가하기 위해``python3 src/py/flwr_tool/"
+"update_changelog.py ``을 실행합니다 (변경 로그가 만족스러워질 "
+"때까지 수동으로 변경해도 됩니다)."
#: ../../source/contributor-how-to-release-flower.rst:12
msgid ""
-"Once the changelog has been updated with all the changes, run ``./dev"
-"/prepare-release-changelog.sh v``, where ```` "
-"is the version stated in ``pyproject.toml`` (notice the ``v`` added "
-"before it). This will replace the ``Unreleased`` header of the changelog "
-"by the version and current date, and it will add a thanking message for "
-"the contributors. Open a pull request with those changes."
+"Once the changelog has been updated with all the changes, run ``./dev/"
+"prepare-release-changelog.sh v``, where ```` is "
+"the version stated in ``pyproject.toml`` (notice the ``v`` added before it). "
+"This will replace the ``Unreleased`` header of the changelog by the version "
+"and current date, and it will add a thanking message for the contributors. "
+"Open a pull request with those changes."
msgstr ""
-"모든 변경 사항으로 변경 로그가 업데이트되면,``./dev/prepare-release-changelog.sh "
-"v``을 실행합니다. 여기서 ````은 ``pyproject.toml``에 명시된 "
-"버전 번호입니다 (앞에 ``v``가 추가된 것을 주의하세요). 이 명령어는 변경 로그의 ``Unreleased``헤더를 해당 버전과"
-" 현재 날짜로 교체하고, 기여자들에게 감사 메시지가 추가됩니다. 이러한 변경 사항으로 pull request합니다."
+"모든 변경 사항으로 변경 로그가 업데이트되면,``./dev/prepare-release-"
+"changelog.sh v``을 실행합니다. 여기서 ````은 "
+"``pyproject.toml``에 명시된 버전 번호입니다 (앞에 ``v``가 추가된 것을 주의하"
+"세요). 이 명령어는 변경 로그의 ``Unreleased``헤더를 해당 버전과 현재 날짜로 "
+"교체하고, 기여자들에게 감사 메시지가 추가됩니다. 이러한 변경 사항으로 pull "
+"request합니다."
#: ../../source/contributor-how-to-release-flower.rst:13
msgid ""
"Once the pull request is merged, tag the release commit with the version "
-"number as soon as the PR is merged: ``git tag v`` (notice "
-"the ``v`` added before the version number), then ``git push --tags``. "
-"This will create a draft release on GitHub containing the correct "
-"artifacts and the relevant part of the changelog."
+"number as soon as the PR is merged: ``git tag v`` (notice the "
+"``v`` added before the version number), then ``git push --tags``. This will "
+"create a draft release on GitHub containing the correct artifacts and the "
+"relevant part of the changelog."
msgstr ""
"pull request가 병합되면, PR이 병합되는 즉시 버전 번호로 릴리즈 커밋에 태그를 "
-"지정합니다:``git tag v`` (버전 번호 앞에 ``v``가 추가된 것을 "
-"확인), 그 다음 ``git push --tags``. 이렇게 하면 올바른 아티팩트와 변경 "
-"로그의 관련 부분이 포함된 초안 릴리즈가 GitHub에 생성됩니다."
+"지정합니다:``git tag v`` (버전 번호 앞에 ``v``가 추가된 것을 확"
+"인), 그 다음 ``git push --tags``. 이렇게 하면 올바른 아티팩트와 변경 로그의 "
+"관련 부분이 포함된 초안 릴리즈가 GitHub에 생성됩니다."
#: ../../source/contributor-how-to-release-flower.rst:14
-msgid "Check the draft release on GitHub, and if everything is good, publish it."
+msgid ""
+"Check the draft release on GitHub, and if everything is good, publish it."
msgstr "GitHub에서 릴리즈 초안을 확인하고, 모든 것이 양호하면 게시하세요."
#: ../../source/contributor-how-to-release-flower.rst:15
@@ -824,10 +850,10 @@ msgstr "Docker 이미지 빌드를 위해 CI를 트리거합니다."
#: ../../source/contributor-how-to-release-flower.rst:17
msgid ""
-"To trigger the workflow, a collaborator must create a "
-"``workflow_dispatch`` event in the GitHub CI. This can be done either "
-"through the UI or via the GitHub CLI. The event requires only one input, "
-"the Flower version, to be released."
+"To trigger the workflow, a collaborator must create a ``workflow_dispatch`` "
+"event in the GitHub CI. This can be done either through the UI or via the "
+"GitHub CLI. The event requires only one input, the Flower version, to be "
+"released."
msgstr ""
"워크플로우를 트리거하려면 공동 작업자가 GitHub CI에서 ``workflow_dispatch``"
"를 생성해야 합니다. 이 작업은 UI 또는 GitHub CLI 를 통해 수행할 수 있습니다. "
@@ -839,18 +865,19 @@ msgstr "**UI를 통해서**"
#: ../../source/contributor-how-to-release-flower.rst:23
msgid ""
-"Go to the ``Build docker images`` workflow `page "
-"`_."
+"Go to the ``Build docker images`` workflow `page `_."
msgstr ""
"``Build docker images`` 워크플로우 `페이지 `_로 이동합니다."
#: ../../source/contributor-how-to-release-flower.rst:24
msgid ""
-"Click on the ``Run workflow`` button and type the new version of Flower "
-"in the ``Version of Flower`` input field."
-msgstr "``Run workflow`` 버튼을 누르고 ``Version of Flower``에 Flower의 새버전을 "
-"입력합니다."
+"Click on the ``Run workflow`` button and type the new version of Flower in "
+"the ``Version of Flower`` input field."
+msgstr ""
+"``Run workflow`` 버튼을 누르고 ``Version of Flower``에 Flower의 새버전을 입력"
+"합니다."
#: ../../source/contributor-how-to-release-flower.rst:25
msgid "Click on the **green** ``Run workflow`` button."
@@ -864,16 +891,17 @@ msgstr "**GitHub CI를 통해서**"
msgid ""
"Make sure you are logged in via ``gh auth login`` and that the current "
"working directory is the root of the Flower repository."
-msgstr "``gh auth login``을 통해 로그인 했는지, 현재 작업 디렉토리가 Flower "
-"리포지토리의 root인지 확인하세요."
+msgstr ""
+"``gh auth login``을 통해 로그인 했는지, 현재 작업 디렉토리가 Flower 리포지토"
+"리의 root인지 확인하세요."
#: ../../source/contributor-how-to-release-flower.rst:32
msgid ""
"Trigger the workflow via ``gh workflow run docker-images.yml -f flwr-"
"version=``."
msgstr ""
-"``gh workflow run docker-images.yml -f flwr-version=``을 통해 "
-"워크플로우 를 트리거합니다."
+"``gh workflow run docker-images.yml -f flwr-version=``을 통해 워"
+"크플로우 를 트리거합니다."
#: ../../source/contributor-how-to-release-flower.rst:35
msgid "After the release"
@@ -897,10 +925,11 @@ msgstr "``changelog.md``에 ``Unreleased`` 섹션을 새로 추가합니다."
#: ../../source/contributor-how-to-release-flower.rst:43
msgid ""
-"Merge the pull request on the same day (i.e., before a new nightly "
-"release gets published to PyPI)."
-msgstr "pull request를 같은 날(즉, 새로운 nightly 릴리즈가 PyPI에 게시되기 전에) "
-"병합하세요."
+"Merge the pull request on the same day (i.e., before a new nightly release "
+"gets published to PyPI)."
+msgstr ""
+"pull request를 같은 날(즉, 새로운 nightly 릴리즈가 PyPI에 게시되기 전에) 병합"
+"하세요."
#: ../../source/contributor-how-to-release-flower.rst:46
msgid "Publishing a pre-release"
@@ -912,11 +941,11 @@ msgstr "사전 릴리즈 이름"
#: ../../source/contributor-how-to-release-flower.rst:51
msgid ""
-"PyPI supports pre-releases (alpha, beta, release candidate). Pre-releases"
-" MUST use one of the following naming patterns:"
+"PyPI supports pre-releases (alpha, beta, release candidate). Pre-releases "
+"MUST use one of the following naming patterns:"
msgstr ""
-"PyPI는 사전 릴리즈(알파, 베타, 릴리스 후보)를 지원합니다. 사전 릴리즈는 "
-"반드시 다음 명명 패턴 중 하나를 사용해야 합니다:"
+"PyPI는 사전 릴리즈(알파, 베타, 릴리스 후보)를 지원합니다. 사전 릴리즈는 반드"
+"시 다음 명명 패턴 중 하나를 사용해야 합니다:"
#: ../../source/contributor-how-to-release-flower.rst:53
msgid "Alpha: ``MAJOR.MINOR.PATCHaN``"
@@ -954,7 +983,8 @@ msgstr "``1.0.0rc1``"
msgid ""
"This is in line with PEP-440 and the recommendations from the Python "
"Packaging Authority (PyPA):"
-msgstr "이는 PEP-440 및 Python Packaging Authority (PyPA)의 권장 사항과 일치합니다:"
+msgstr ""
+"이는 PEP-440 및 Python Packaging Authority (PyPA)의 권장 사항과 일치합니다:"
#: ../../source/contributor-how-to-release-flower.rst:67
msgid "`PEP-440 `_"
@@ -962,37 +992,38 @@ msgstr "`PEP-440 `_"
#: ../../source/contributor-how-to-release-flower.rst:68
msgid ""
-"`PyPA Choosing a versioning scheme "
-"`_"
+"`PyPA Choosing a versioning scheme `_"
msgstr ""
"`PyPA 버전 관리 체계 선택하기 `_"
#: ../../source/contributor-how-to-release-flower.rst:70
msgid ""
-"Note that the approach defined by PyPA is not compatible with SemVer "
-"2.0.0 spec, for details consult the `Semantic Versioning Specification "
-"`_ (specifically item "
-"11 on precedence)."
+"Note that the approach defined by PyPA is not compatible with SemVer 2.0.0 "
+"spec, for details consult the `Semantic Versioning Specification `_ (specifically item 11 on "
+"precedence)."
msgstr ""
-"PyPA에서 정의한 접근 방식은 SemVer 2.0.0 사양과 호환되지 않으며, 자세한 "
-"내용은`Semantic Versioning 관리 사양 `_ (특히 항목 11이 우선순위)을 참조하세요."
+"PyPA에서 정의한 접근 방식은 SemVer 2.0.0 사양과 호환되지 않으며, 자세한 내용"
+"은`Semantic Versioning 관리 사양 `_ (특히 항목 11이 우선순위)을 참조하세요."
#: ../../source/contributor-how-to-release-flower.rst:73
msgid "Pre-release classification"
msgstr "사전 릴리즈 분류"
#: ../../source/contributor-how-to-release-flower.rst:75
-msgid "Should the next pre-release be called alpha, beta, or release candidate?"
-msgstr "다음 사전 릴리를 알파, 베타 또는 릴리스 후보라고 불러야 하나요?"
+msgid ""
+"Should the next pre-release be called alpha, beta, or release candidate?"
+msgstr "다음 사전 릴리즈를 알파, 베타 또는 릴리스 후보라고 불러야 하나요?"
#: ../../source/contributor-how-to-release-flower.rst:77
msgid ""
-"RC: feature complete, no known issues (apart from issues that are "
-"classified as \"won't fix\" for the next stable release) - if no issues "
-"surface this will become the next stable release"
+"RC: feature complete, no known issues (apart from issues that are classified "
+"as \"won't fix\" for the next stable release) - if no issues surface this "
+"will become the next stable release"
msgstr ""
"RC: 기능 완료, 알려진 문제 없음(다음 stable 릴리즈에서 \"수정되지 않음\"으로 "
"분류된 문제 제외) - 문제가 나타나지 않으면 다음 stable 릴리즈가 됩니다"
@@ -1013,12 +1044,12 @@ msgstr "가상 환경 설정"
msgid ""
"It is recommended to run your Python setup within a virtual environment. "
"This guide shows three different examples how to create a virtual "
-"environment with pyenv virtualenv, poetry, or Anaconda. You can follow "
-"the instructions or choose your preferred setup."
+"environment with pyenv virtualenv, poetry, or Anaconda. You can follow the "
+"instructions or choose your preferred setup."
msgstr ""
"가상 환경 내에서 파이썬 설정을 실행하는 것이 좋습니다. 이 가이드에서는 pyenv "
-"virtualenv, poetry 또는 Anaconda를 사용하여 가상 환경을 만드는 세 가지 "
-"예제를 보여줍니다. 안내를 따르거나 원하는 설정을 선택할 수 있습니다."
+"virtualenv, poetry 또는 Anaconda를 사용하여 가상 환경을 만드는 세 가지 예제"
+"를 보여줍니다. 안내를 따르거나 원하는 설정을 선택할 수 있습니다."
#: ../../source/contributor-how-to-set-up-a-virtual-env.rst:9
msgid "Python Version"
@@ -1027,23 +1058,21 @@ msgstr "Python 버전"
#: ../../source/contributor-how-to-set-up-a-virtual-env.rst:11
#: ../../source/how-to-install-flower.rst:8
msgid ""
-"Flower requires at least `Python 3.8 `_, "
-"but `Python 3.10 `_ or above is "
-"recommended."
+"Flower requires at least `Python 3.8 `_, but "
+"`Python 3.10 `_ or above is recommended."
msgstr ""
-"Flower는 `Python 3.8 `_이상이 필요하지만, `"
-"Python 3.10 `_이상을 권장합니다."
+"Flower는 `Python 3.8 `_이상이 필요하지만, "
+"`Python 3.10 `_이상을 권장합니다."
#: ../../source/contributor-how-to-set-up-a-virtual-env.rst:14
msgid ""
-"Due to a known incompatibility with `ray "
-"`_, we currently recommend utilizing at "
-"most `Python 3.11 `_ for running Flower "
-"simulations."
+"Due to a known incompatibility with `ray `_, "
+"we currently recommend utilizing at most `Python 3.11 `_ for running Flower simulations."
msgstr ""
-"`Ray `__와 호환되지 않는 것으로 알려져 "
-"있으므로, 현재 Flower 시뮬레이션을 실행할 때는 최대 `Python 3.11 "
-"`_을 사용하는 것이 좋습니다."
+"`Ray `__와 호환되지 않는 것으로 알려져 있으므"
+"로, 현재 Flower 시뮬레이션을 실행할 때는 최대 `Python 3.11 `_을 사용하는 것이 좋습니다."
#: ../../source/contributor-how-to-set-up-a-virtual-env.rst:19
msgid "Virtualenv with Pyenv/Virtualenv"
@@ -1051,23 +1080,23 @@ msgstr "Pyenv/Virtualenv를 사용한 가상 환경"
#: ../../source/contributor-how-to-set-up-a-virtual-env.rst:21
msgid ""
-"One of the recommended virtual environment is `pyenv "
-"`_/`virtualenv `_. Please see `Flower examples "
-"`_ for details."
+"One of the recommended virtual environment is `pyenv `_/`virtualenv `_. "
+"Please see `Flower examples `_ for details."
msgstr ""
-"권장 가상 환경 중 하나는 `pyenv `_/`"
-"virtualenv `_입니다. 자세한 "
-"내용은 `Flower examples `"
-"_를 참조하세요."
+"권장 가상 환경 중 하나는 `pyenv `_/"
+"`virtualenv `_입니다. 자세한 내용"
+"은 `Flower examples `_를 "
+"참조하세요."
#: ../../source/contributor-how-to-set-up-a-virtual-env.rst:23
msgid ""
"Once Pyenv is set up, you can use it to install `Python Version 3.10 "
"`_ or above:"
msgstr ""
-"Pyenv가 설정되면 이를 사용하여 'Python 버전 3.10 `_ 이상'을 설치할 수 있습니다:"
+"Pyenv가 설정되면 이를 사용하여 'Python 버전 3.10 `_ 이상'을 설치할 수 있습니다:"
#: ../../source/contributor-how-to-set-up-a-virtual-env.rst:29
msgid "Create the virtualenv with:"
@@ -1083,19 +1112,20 @@ msgstr "Poetry를 사용한 가상 환경"
#: ../../source/contributor-how-to-set-up-a-virtual-env.rst:46
msgid ""
-"The Flower examples are based on `Poetry `_ to manage dependencies. After installing Poetry you "
-"simply create a virtual environment with:"
+"The Flower examples are based on `Poetry `_ "
+"to manage dependencies. After installing Poetry you simply create a virtual "
+"environment with:"
msgstr ""
-"Flower examples은 dependencies을 관리하기 위해 `Poetry `_를 기반으로 합니다. Poetry를 설치한 후 가상 환경을 생성하기만 "
-"하면 됩니다:"
+"Flower examples은 의존성을 관리하기 위해 `Poetry `_를 기반으로 합니다. Poetry를 설치한 후 가상 환경을 생성하기만 하면 "
+"됩니다:"
#: ../../source/contributor-how-to-set-up-a-virtual-env.rst:52
msgid ""
-"If you open a new terminal you can activate the previously created "
-"virtual environment with the following command:"
-msgstr "새 터미널을 열면 다음 명령을 사용하여 이전에 생성한 가상 환경을 활성화할 수 "
+"If you open a new terminal you can activate the previously created virtual "
+"environment with the following command:"
+msgstr ""
+"새 터미널을 열면 다음 명령을 사용하여 이전에 생성한 가상 환경을 활성화할 수 "
"있습니다:"
#: ../../source/contributor-how-to-set-up-a-virtual-env.rst:60
@@ -1104,12 +1134,12 @@ msgstr "Anaconda를 사용한 가상 환경"
#: ../../source/contributor-how-to-set-up-a-virtual-env.rst:62
msgid ""
-"If you prefer to use Anaconda for your virtual environment then install "
-"and setup the `conda `_ package. After setting it up you can "
-"create a virtual environment with:"
+"If you prefer to use Anaconda for your virtual environment then install and "
+"setup the `conda `_ package. After setting it up you can create a virtual "
+"environment with:"
msgstr ""
-"가상 환경에서 Anaconda를 사용하려면 `conda `_ 패키지를 설치 및 "
"설정하세요. 설정 후 다음을 사용하여 가상 환경을 만들 수 있습니다:"
@@ -1123,8 +1153,8 @@ msgstr "그다음은?"
#: ../../source/contributor-how-to-set-up-a-virtual-env.rst:78
msgid ""
-"As soon as you created your virtual environment you clone one of the "
-"`Flower examples `_."
+"As soon as you created your virtual environment you clone one of the `Flower "
+"examples `_."
msgstr ""
"가상 환경을 생성하자마자 'Flower examples `_ 중 하나를 클론합니다."
@@ -1139,25 +1169,24 @@ msgstr "프로젝트 레이아웃"
#: ../../source/contributor-how-to-write-documentation.rst:8
msgid ""
-"The Flower documentation lives in the ``doc`` directory. The Sphinx-based"
-" documentation system supports both reStructuredText (``.rst`` files) and"
-" Markdown (``.md`` files)."
+"The Flower documentation lives in the ``doc`` directory. The Sphinx-based "
+"documentation system supports both reStructuredText (``.rst`` files) and "
+"Markdown (``.md`` files)."
msgstr ""
"Flower 문서는 ``doc`` 디렉토리에 있습니다. Sphinx 기반 문서 시스템은 "
-"reStructuredText 텍스트(``.rst`` 파일)와 Markdown(``.md`` 파일)을 모두 "
-"지원합니다."
+"reStructuredText 텍스트(``.rst`` 파일)와 Markdown(``.md`` 파일)을 모두 지원합"
+"니다."
#: ../../source/contributor-how-to-write-documentation.rst:10
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:169
msgid ""
-"Note that, in order to build the documentation locally (with ``poetry run"
-" make html``, like described below), `Pandoc "
-"`_ needs to be installed on the "
-"system."
+"Note that, in order to build the documentation locally (with ``poetry run "
+"make html``, like described below), `Pandoc `_ needs to be installed on the system."
msgstr ""
-"로컬에서 문서를 작성하려면(아래 설명과 같이 ``poetry run make html``로) `"
-"Pandoc `_이 시스템에 설치되어 있어야 "
-"합니다."
+"로컬에서 문서를 작성하려면(아래 설명과 같이 ``poetry run make html``로) "
+"`Pandoc `_이 시스템에 설치되어 있어야 합"
+"니다."
#: ../../source/contributor-how-to-write-documentation.rst:14
msgid "Edit an existing page"
@@ -1170,7 +1199,8 @@ msgstr "doc/source/``에서 기존 ``.rst``(또는 ``.md``) 파일을 편집합
#: ../../source/contributor-how-to-write-documentation.rst:17
#: ../../source/contributor-how-to-write-documentation.rst:27
msgid "Compile the docs: ``cd doc``, then ``poetry run make html``"
-msgstr "문서를 컴파일합니다: ``cd doc``, ``poetry run make html`` 순으로 컴파일합니다"
+msgstr ""
+"문서를 컴파일합니다: ``cd doc``, ``poetry run make html`` 순으로 컴파일합니다"
#: ../../source/contributor-how-to-write-documentation.rst:18
#: ../../source/contributor-how-to-write-documentation.rst:28
@@ -1195,18 +1225,18 @@ msgstr "``index.rst``에서 새 rst로 연결합니다"
#: ../../source/contributor-ref-good-first-contributions.rst:2
msgid "Good first contributions"
-msgstr "좋은 첫 번째 기여"
+msgstr "훌륭한 첫 번째 기여"
#: ../../source/contributor-ref-good-first-contributions.rst:4
msgid ""
-"We welcome contributions to Flower! However, it is not always easy to "
-"know where to start. We therefore put together a few recommendations on "
-"where to start to increase your chances of getting your PR accepted into "
-"the Flower codebase."
+"We welcome contributions to Flower! However, it is not always easy to know "
+"where to start. We therefore put together a few recommendations on where to "
+"start to increase your chances of getting your PR accepted into the Flower "
+"codebase."
msgstr ""
"Flower에 대한 기여를 환영합니다! 하지만 어디서부터 시작해야 할지 알기란 쉽지 "
-"않습니다. 그래서 저희는 여러분의 PR이 Flower 코드베이스에 채택될 가능성을 "
-"높이기 위해 어디서부터 시작해야 하는지 몇 가지 권장 사항을 정리해 보았습니다."
+"않습니다. 그래서 저희는 여러분의 PR이 Flower 코드베이스에 채택될 가능성을 높"
+"이기 위해 어디서부터 시작해야 하는지 몇 가지 권장 사항을 정리해 보았습니다."
#: ../../source/contributor-ref-good-first-contributions.rst:11
msgid "Where to start"
@@ -1214,13 +1244,13 @@ msgstr "시작 위치"
#: ../../source/contributor-ref-good-first-contributions.rst:13
msgid ""
-"Until the Flower core library matures it will be easier to get PR's "
-"accepted if they only touch non-core areas of the codebase. Good "
-"candidates to get started are:"
+"Until the Flower core library matures it will be easier to get PR's accepted "
+"if they only touch non-core areas of the codebase. Good candidates to get "
+"started are:"
msgstr ""
"Flower 코어 라이브러리가 완성될 때까지는 코드베이스의 비핵심 영역만 건드리는 "
-"것이 PR을 승인받기가 더 쉬울 것입니다. 시작하기에 좋은 후보자는 다음과 "
-"같습니다:"
+"것이 PR을 승인받기가 더 쉬울 것입니다. 시작하기에 좋은 후보자는 다음과 같습니"
+"다:"
#: ../../source/contributor-ref-good-first-contributions.rst:17
msgid "Documentation: What's missing? What could be expressed more clearly?"
@@ -1240,31 +1270,31 @@ msgstr "Flower Baselines 요청"
#: ../../source/contributor-ref-good-first-contributions.rst:25
msgid ""
-"If you are not familiar with Flower Baselines, you should probably check-"
-"out our `contributing guide for baselines "
-"`_."
+"If you are not familiar with Flower Baselines, you should probably check-out "
+"our `contributing guide for baselines `_."
msgstr ""
"Flower Baseline에 익숙하지 않다면 ' Baseline 기여 가이드 `_를 확인해보세요."
#: ../../source/contributor-ref-good-first-contributions.rst:27
msgid ""
-"You should then check out the open `issues "
-"`_"
-" for baseline requests. If you find a baseline that you'd like to work on"
-" and that has no assignees, feel free to assign it to yourself and start "
-"working on it!"
+"You should then check out the open `issues `_ for baseline "
+"requests. If you find a baseline that you'd like to work on and that has no "
+"assignees, feel free to assign it to yourself and start working on it!"
msgstr ""
-"그런 다음 오픈 된 `이슈 `_에서 baseline "
"요청을 확인해야 합니다. 작업하고 싶은 기준선을 찾았지만 담당자가 없는 경우, "
"자유롭게 자신에게 할당하고 작업을 시작하세요!"
#: ../../source/contributor-ref-good-first-contributions.rst:31
msgid ""
-"Otherwise, if you don't find a baseline you'd like to work on, be sure to"
-" open a new issue with the baseline request template!"
-msgstr "그렇지 않으면 작업하고 싶은 baseline을 찾지 못하면 baseline 요청 템플릿으로 "
+"Otherwise, if you don't find a baseline you'd like to work on, be sure to "
+"open a new issue with the baseline request template!"
+msgstr ""
+"그렇지 않으면 작업하고 싶은 baseline을 찾지 못하면 baseline 요청 템플릿으로 "
"새 이슈를 열어야 합니다!"
#: ../../source/contributor-ref-good-first-contributions.rst:34
@@ -1274,8 +1304,8 @@ msgstr "예시 요청"
#: ../../source/contributor-ref-good-first-contributions.rst:36
msgid ""
"We wish we had more time to write usage examples because we believe they "
-"help users to get started with building what they want to build. Here are"
-" a few ideas where we'd be happy to accept a PR:"
+"help users to get started with building what they want to build. Here are a "
+"few ideas where we'd be happy to accept a PR:"
msgstr ""
"사용 예시는 사용자가 원하는 것을 구축하는 데 도움이 된다고 생각하기 때문에 "
"더 많은 시간을 할애하여 작성할 수 있었으면 합니다. 다음은 저희가 기꺼이 PR을 "
@@ -1299,15 +1329,15 @@ msgstr "Secure Aggregation 프로토콜"
#: ../../source/contributor-ref-secure-aggregation-protocols.rst:4
msgid ""
-"Include SecAgg, SecAgg+, and LightSecAgg protocol. The LightSecAgg "
-"protocol has not been implemented yet, so its diagram and abstraction may"
-" not be accurate in practice. The SecAgg protocol can be considered as a "
-"special case of the SecAgg+ protocol."
+"Include SecAgg, SecAgg+, and LightSecAgg protocol. The LightSecAgg protocol "
+"has not been implemented yet, so its diagram and abstraction may not be "
+"accurate in practice. The SecAgg protocol can be considered as a special "
+"case of the SecAgg+ protocol."
msgstr ""
-"SecAgg, SecAgg+, LightSecAgg 프로토콜을 포함합니다. LightSecAgg 프로토콜은 "
-"아직 구현되지 않았기 때문에 다이어그램과 추상화가 실제로는 정확하지 않을 수 "
-"있습니다. SecAgg 프로토콜은 SecAgg+ 프로토콜의 특수한 경우로 간주할 수 "
-"있습니다."
+"SecAgg, SecAgg+, LightSecAgg 프로토콜을 포함합니다. LightSecAgg 프로토콜은 아"
+"직 구현되지 않았기 때문에 다이어그램과 추상화가 실제로는 정확하지 않을 수 있"
+"습니다. SecAgg 프로토콜은 SecAgg+ 프로토콜의 특수한 경우로 간주할 수 있습니"
+"다."
#: ../../source/contributor-ref-secure-aggregation-protocols.rst:8
msgid "The :code:`SecAgg+` abstraction"
@@ -1317,18 +1347,18 @@ msgstr "The :code:`SecAgg+` 추상화"
#: ../../source/contributor-ref-secure-aggregation-protocols.rst:161
msgid ""
"In this implementation, each client will be assigned with a unique index "
-"(int) for secure aggregation, and thus many python dictionaries used have"
-" keys of int type rather than ClientProxy type."
+"(int) for secure aggregation, and thus many python dictionaries used have "
+"keys of int type rather than ClientProxy type."
msgstr ""
-"구현에서는 각 클라이언트에 secure aggregation를 위한 고유 인덱스(int)가 "
-"할당되므로 사용되는 많은 파이썬 dictionaries에는 ClientProxy 타입이 아닌 int "
-"타입의 키가 있습니다."
+"구현에서는 각 클라이언트에 secure aggregation를 위한 고유 인덱스(int)가 할당"
+"되므로 사용되는 많은 파이썬 dictionaries에는 ClientProxy 타입이 아닌 int 타입"
+"의 키가 있습니다."
#: ../../source/contributor-ref-secure-aggregation-protocols.rst:65
#: ../../source/contributor-ref-secure-aggregation-protocols.rst:198
msgid ""
-"The Flower server will execute and process received results in the "
-"following order:"
+"The Flower server will execute and process received results in the following "
+"order:"
msgstr "Flower 서버는 수신된 결과를 다음 순서로 실행하고 처리합니다:"
#: ../../source/contributor-ref-secure-aggregation-protocols.rst:159
@@ -1345,16 +1375,17 @@ msgstr "GitHub에서 기여하기"
#: ../../source/contributor-tutorial-contribute-on-github.rst:4
msgid ""
-"This guide is for people who want to get involved with Flower, but who "
-"are not used to contributing to GitHub projects."
-msgstr "이 가이드는 Flower에 참여하고 싶지만 GitHub 프로젝트에 기여하는 데 익숙하지 "
+"This guide is for people who want to get involved with Flower, but who are "
+"not used to contributing to GitHub projects."
+msgstr ""
+"이 가이드는 Flower에 참여하고 싶지만 GitHub 프로젝트에 기여하는 데 익숙하지 "
"않은 분들을 위한 것입니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:6
msgid ""
-"If you're familiar with how contributing on GitHub works, you can "
-"directly checkout our :doc:`getting started guide for contributors "
-"`."
+"If you're familiar with how contributing on GitHub works, you can directly "
+"checkout our :doc:`getting started guide for contributors `."
msgstr ""
"깃허브에서 기여하는 방식에 익숙하다면 :doc:`기여자를 위한 시작 가이드"
"`를 직접 확인하세요."
@@ -1372,19 +1403,19 @@ msgid ""
"Git is a distributed version control tool. This allows for an entire "
"codebase's history to be stored and every developer's machine. It is a "
"software that will need to be installed on your local machine, you can "
-"follow this `guide `_ to set it up."
+"follow this `guide `_ to set it up."
msgstr ""
"Git은 분산 버전 관리 도구입니다. 이를 통해 전체 코드베이스의 히스토리와 모든 "
-"개발자의 컴퓨터를 저장할 수 있습니다. 로컬 컴퓨터에 설치해야 하는 "
-"소프트웨어로, 이 `가이드 `_를 따라 설정할 수 있습니다."
+"개발자의 컴퓨터를 저장할 수 있습니다. 로컬 컴퓨터에 설치해야 하는 소프트웨어"
+"로, 이 `가이드 `_를 따라 설정할 수 있습니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:16
msgid ""
"GitHub, itself, is a code hosting platform for version control and "
-"collaboration. It allows for everyone to collaborate and work from "
-"anywhere on remote repositories."
+"collaboration. It allows for everyone to collaborate and work from anywhere "
+"on remote repositories."
msgstr ""
"GitHub는 그 자체로 버전 관리 및 협업을 위한 코드 호스팅 플랫폼입니다. 누구나 "
"원격 레포지토리에서 어디서든 협업하고 작업할 수 있습니다."
@@ -1393,19 +1424,20 @@ msgstr ""
msgid ""
"If you haven't already, you will need to create an account on `GitHub "
"`_."
-msgstr "아직 계정을 만들지 않았다면 `GitHub `_에서 계정을 "
+msgstr ""
+"아직 계정을 만들지 않았다면 `GitHub `_에서 계정을 "
"만들어야 합니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:20
msgid ""
-"The idea behind the generic Git and GitHub workflow boils down to this: "
-"you download code from a remote repository on GitHub, make changes "
-"locally and keep track of them using Git and then you upload your new "
-"history back to GitHub."
+"The idea behind the generic Git and GitHub workflow boils down to this: you "
+"download code from a remote repository on GitHub, make changes locally and "
+"keep track of them using Git and then you upload your new history back to "
+"GitHub."
msgstr ""
"일반적인 Git 및 GitHub 워크플로우의 기본 개념은 다음과 같이 요약됩니다. "
-"GitHub의 원격 레포지토리에서 코드를 다운로드하고 로컬에서 변경한 후 Git을 "
-"사용하여 추적한 다음 새 기록을 다시 GitHub에 업로드하는 것입니다."
+"GitHub의 원격 레포지토리에서 코드를 다운로드하고 로컬에서 변경한 후 Git을 사"
+"용하여 추적한 다음 새 기록을 다시 GitHub에 업로드하는 것입니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:32
msgid "**Forking the Flower repository**"
@@ -1413,25 +1445,25 @@ msgstr "**Flower 레포지토리 포크하기**"
#: ../../source/contributor-tutorial-contribute-on-github.rst:24
msgid ""
-"A fork is a personal copy of a GitHub repository. To create one for "
-"Flower, you must navigate to ``_ (while "
-"connected to your GitHub account) and click the ``Fork`` button situated "
-"on the top right of the page."
+"A fork is a personal copy of a GitHub repository. To create one for Flower, "
+"you must navigate to ``_ (while connected to "
+"your GitHub account) and click the ``Fork`` button situated on the top right "
+"of the page."
msgstr ""
"포크는 GitHub 리포지토리의 개인 복사본입니다. Flower용 포크를 만들려면 "
-"``_로 이동하여(GitHub 계정에 연결된 상태에서)"
-" 페이지 오른쪽 상단에 있는 ``포크`` 버튼을 클릭해야 합니다."
+"``_로 이동하여(GitHub 계정에 연결된 상태에"
+"서) 페이지 오른쪽 상단에 있는 ``포크`` 버튼을 클릭해야 합니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:29
msgid ""
"You can change the name if you want, but this is not necessary as this "
-"version of Flower will be yours and will sit inside your own account "
-"(i.e., in your own list of repositories). Once created, you should see on"
-" the top left corner that you are looking at your own version of Flower."
+"version of Flower will be yours and will sit inside your own account (i.e., "
+"in your own list of repositories). Once created, you should see on the top "
+"left corner that you are looking at your own version of Flower."
msgstr ""
-"원하는 경우 이름을 변경할 수 있지만, 이 버전의 Flower는 자신의 계정(즉, "
-"자신의 리포지토리 목록)에 위치하게 되므로 변경할 필요는 없습니다. 만들기가 "
-"완료되면 왼쪽 상단에Flower 버전이 표시되는 것을 볼 수 있습니다."
+"원하는 경우 이름을 변경할 수 있지만, 이 버전의 Flower는 자신의 계정(즉, 자신"
+"의 리포지토리 목록)에 위치하게 되므로 변경할 필요는 없습니다. 만들기가 완료되"
+"면 왼쪽 상단에Flower 버전이 표시되는 것을 볼 수 있습니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:47
msgid "**Cloning your forked repository**"
@@ -1440,27 +1472,29 @@ msgstr "**포크된 레포지토리 클론하기**"
#: ../../source/contributor-tutorial-contribute-on-github.rst:35
msgid ""
"The next step is to download the forked repository on your machine to be "
-"able to make changes to it. On your forked repository page, you should "
-"first click on the ``Code`` button on the right, this will give you the "
-"ability to copy the HTTPS link of the repository."
+"able to make changes to it. On your forked repository page, you should first "
+"click on the ``Code`` button on the right, this will give you the ability to "
+"copy the HTTPS link of the repository."
msgstr ""
-"다음 단계는 컴퓨터에서 포크된 레포지토리를 변경할 수 있도록 다운로드하는 "
-"것입니다. 포크된 포지토리 페이지에서 먼저 오른쪽의 ``Code`` 버튼을 클릭하면 "
-"레포지토리의 HTTPS 링크를 복사할 수 있습니다."
+"다음 단계는 컴퓨터에서 포크된 레포지토리를 변경할 수 있도록 다운로드하는 것입"
+"니다. 포크된 포지토리 페이지에서 먼저 오른쪽의 ``Code`` 버튼을 클릭하면 레포"
+"지토리의 HTTPS 링크를 복사할 수 있습니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:41
msgid ""
"Once you copied the \\, you can open a terminal on your machine, "
"navigate to the place you want to download the repository to and type:"
-msgstr "\\를 복사한 후에는 컴퓨터에서 터미널을 열고 레포지토리를 다운로드할 "
-"위치로 이동하여 입력하면 됩니다:"
+msgstr ""
+"\\를 복사한 후에는 컴퓨터에서 터미널을 열고 레포지토리를 다운로드할 위"
+"치로 이동하여 입력하면 됩니다:"
#: ../../source/contributor-tutorial-contribute-on-github.rst:47
msgid ""
-"This will create a ``flower/`` (or the name of your fork if you renamed "
-"it) folder in the current working directory."
-msgstr "현재 작업 디렉터리에``flower/``(또는 포크 이름을 변경한 경우 포크 이름) "
-"폴더가 생성됩니다."
+"This will create a ``flower/`` (or the name of your fork if you renamed it) "
+"folder in the current working directory."
+msgstr ""
+"현재 작업 디렉터리에``flower/``(또는 포크 이름을 변경한 경우 포크 이름) 폴더"
+"가 생성됩니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:66
msgid "**Add origin**"
@@ -1472,14 +1506,14 @@ msgstr "그런 다음 레포지토리 폴더로 이동할 수 있습니다:"
#: ../../source/contributor-tutorial-contribute-on-github.rst:56
msgid ""
-"And here we will need to add an origin to our repository. The origin is "
-"the \\ of the remote fork repository. To obtain it, we can do as "
-"previously mentioned by going to our fork repository on our GitHub "
-"account and copying the link."
+"And here we will need to add an origin to our repository. The origin is the "
+"\\ of the remote fork repository. To obtain it, we can do as "
+"previously mentioned by going to our fork repository on our GitHub account "
+"and copying the link."
msgstr ""
-"여기에 레포지토리에 origin을 추가해야 합니다. origin은 원격 포크 "
-"레포지토리의 \\입니다. origin을 얻으려면 앞서 설명한 대로 GitHub "
-"계정의 포크 레포지토리로 이동하여 링크를 복사하면 됩니다."
+"여기에 레포지토리에 origin을 추가해야 합니다. origin은 원격 포크 레포지토리"
+"의 \\입니다. origin을 얻으려면 앞서 설명한 대로 GitHub 계정의 포크 레"
+"포지토리로 이동하여 링크를 복사하면 됩니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:61
msgid ""
@@ -1495,32 +1529,34 @@ msgstr "**Upstream 추가하기**"
msgid ""
"Now we will add an upstream address to our repository. Still in the same "
"directory, we must run the following command:"
-msgstr "이제 레포지토리에 upstream 주소를 추가하겠습니다. 여전히 같은 디렉터리에서 "
-"다음 명령을 실행해야 합니다:"
+msgstr ""
+"이제 레포지토리에 upstream 주소를 추가하겠습니다. 여전히 같은 디렉터리에서 다"
+"음 명령을 실행해야 합니다:"
#: ../../source/contributor-tutorial-contribute-on-github.rst:76
-msgid "The following diagram visually explains what we did in the previous steps:"
+msgid ""
+"The following diagram visually explains what we did in the previous steps:"
msgstr "다음 다이어그램은 이전 단계에서 수행한 작업을 시각적으로 설명합니다:"
#: ../../source/contributor-tutorial-contribute-on-github.rst:80
msgid ""
-"The upstream is the GitHub remote address of the parent repository (in "
-"this case Flower), i.e. the one we eventually want to contribute to and "
-"therefore need an up-to-date history of. The origin is just the GitHub "
-"remote address of the forked repository we created, i.e. the copy (fork) "
-"in our own account."
+"The upstream is the GitHub remote address of the parent repository (in this "
+"case Flower), i.e. the one we eventually want to contribute to and therefore "
+"need an up-to-date history of. The origin is just the GitHub remote address "
+"of the forked repository we created, i.e. the copy (fork) in our own account."
msgstr ""
-"upstream은 부모 레포지토리(이 경우 Flower)의 GitHub 원격 주소, 즉 우리가 "
-"최종적으로 기여하고 싶고 따라서 최신 기록이 필요한 레포지토리입니다. "
-"origin은 우리가 만든 포크된 레포지토리의 GitHub 원격 주소, 즉 우리 계정에 "
-"있는 사본(포크)입니다."
+"upstream은 부모 레포지토리(이 경우 Flower)의 GitHub 원격 주소, 즉 우리가 최종"
+"적으로 기여하고 싶고 따라서 최신 기록이 필요한 레포지토리입니다. origin은 우"
+"리가 만든 포크된 레포지토리의 GitHub 원격 주소, 즉 우리 계정에 있는 사본(포"
+"크)입니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:84
msgid ""
"To make sure our local version of the fork is up-to-date with the latest "
"changes from the Flower repository, we can execute the following command:"
-msgstr "로컬 버전의 포크가 Flower 레포지토리의 최신 변경 사항으로 최신 상태인지 "
-"확인하려면 다음 명령을 실행하면 됩니다:"
+msgstr ""
+"로컬 버전의 포크가 Flower 레포지토리의 최신 변경 사항으로 최신 상태인지 확인"
+"하려면 다음 명령을 실행하면 됩니다:"
#: ../../source/contributor-tutorial-contribute-on-github.rst:93
msgid "Setting up the coding environment"
@@ -1529,12 +1565,12 @@ msgstr "코딩 환경 설정"
#: ../../source/contributor-tutorial-contribute-on-github.rst:95
msgid ""
"This can be achieved by following this :doc:`getting started guide for "
-"contributors ` (note "
-"that you won't need to clone the repository). Once you are able to write "
-"code and test it, you can finally start making changes!"
+"contributors ` (note that "
+"you won't need to clone the repository). Once you are able to write code and "
+"test it, you can finally start making changes!"
msgstr ""
":doc:'기여자를 위한 시작 가이드 '를 참조하세요(리포지토리를 복제할 필요는 없습니다). 코드를 "
+"contributor>'를 참조하세요(레포지토리를 복제할 필요는 없습니다). 코드를 "
"작성하고 테스트할 수 있게 되면 드디어 변경을 시작할 수 있습니다!"
#: ../../source/contributor-tutorial-contribute-on-github.rst:100
@@ -1543,8 +1579,7 @@ msgstr "변경하기"
#: ../../source/contributor-tutorial-contribute-on-github.rst:102
msgid ""
-"Before making any changes make sure you are up-to-date with your "
-"repository:"
+"Before making any changes make sure you are up-to-date with your repository:"
msgstr "변경하기 전에 레포지토리를 최신 상태로 유지하세요:"
#: ../../source/contributor-tutorial-contribute-on-github.rst:108
@@ -1557,16 +1592,15 @@ msgstr "**새 브랜치 만들기**"
#: ../../source/contributor-tutorial-contribute-on-github.rst:115
msgid ""
-"To make the history cleaner and easier to work with, it is good practice "
-"to create a new branch for each feature/project that needs to be "
-"implemented."
-msgstr "히스토리를 더 깔끔하고 작업하기 쉽게 만들려면 구현해야 하는 각 기능/"
-"프로젝트에 대해 새 브랜치를 만드는 것이 좋습니다."
+"To make the history cleaner and easier to work with, it is good practice to "
+"create a new branch for each feature/project that needs to be implemented."
+msgstr ""
+"히스토리를 더 깔끔하고 작업하기 쉽게 만들려면 구현해야 하는 각 기능/프로젝트"
+"에 대해 새 브랜치를 만드는 것이 좋습니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:118
msgid ""
-"To do so, just run the following command inside the repository's "
-"directory:"
+"To do so, just run the following command inside the repository's directory:"
msgstr "이렇게 하려면 레포지토리 디렉토리에서 다음 명령을 실행하면 됩니다:"
#: ../../source/contributor-tutorial-contribute-on-github.rst:125
@@ -1574,8 +1608,9 @@ msgid "**Make changes**"
msgstr "**변경하기**"
#: ../../source/contributor-tutorial-contribute-on-github.rst:125
-msgid "Write great code and create wonderful changes using your favorite editor!"
-msgstr "선호하 편집기를 사용하여 멋진 코드를 작성하고 훌륭한 변화를 만들어 보세요!"
+msgid ""
+"Write great code and create wonderful changes using your favorite editor!"
+msgstr "선호하는 편집기를 사용하여 멋진 코드를 작성하고 훌륭한 변화를 만들어 보세요!"
#: ../../source/contributor-tutorial-contribute-on-github.rst:138
msgid "**Test and format your code**"
@@ -1583,9 +1618,9 @@ msgstr "**코드 테스트 및 서식 지정**"
#: ../../source/contributor-tutorial-contribute-on-github.rst:128
msgid ""
-"Don't forget to test and format your code! Otherwise your code won't be "
-"able to be merged into the Flower repository. This is done so the "
-"codebase stays consistent and easy to understand."
+"Don't forget to test and format your code! Otherwise your code won't be able "
+"to be merged into the Flower repository. This is done so the codebase stays "
+"consistent and easy to understand."
msgstr ""
"코드를 테스트하고 서식을 지정하는 것을 잊지 마세요! 그렇지 않으면 코드를 "
"Flower 레포지토리에 병합할 수 없습니다. 이는 코드베이스가 일관성을 유지하고 "
@@ -1601,10 +1636,11 @@ msgstr "**Stage 변경**"
#: ../../source/contributor-tutorial-contribute-on-github.rst:141
msgid ""
-"Before creating a commit that will update your history, you must specify "
-"to Git which files it needs to take into account."
-msgstr "기록을 업데이트할 커밋을 만들기 전에 어떤 파일을 고려해야 하는지 Git에 "
-"지정해야 합니다."
+"Before creating a commit that will update your history, you must specify to "
+"Git which files it needs to take into account."
+msgstr ""
+"기록을 업데이트할 커밋을 만들기 전에 어떤 파일을 고려해야 하는지 Git에 지정해"
+"야 합니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:143
msgid "This can be done with:"
@@ -1612,12 +1648,12 @@ msgstr "이 작업을 수행할 수 있습니다:"
#: ../../source/contributor-tutorial-contribute-on-github.rst:149
msgid ""
-"To check which files have been modified compared to the last version "
-"(last commit) and to see which files are staged for commit, you can use "
-"the :code:`git status` command."
+"To check which files have been modified compared to the last version (last "
+"commit) and to see which files are staged for commit, you can use the :code:"
+"`git status` command."
msgstr ""
-"마지막 버전(마지막 커밋)과 비교하여 수정된 파일을 확인하고 커밋을 위해 "
-"스테이징된 파일을 확인하려면 :code:`git status` 명령을 사용하면 됩니다."
+"마지막 버전(마지막 커밋)과 비교하여 수정된 파일을 확인하고 커밋을 위해 스테이"
+"징된 파일을 확인하려면 :code:`git status` 명령을 사용하면 됩니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:160
msgid "**Commit changes**"
@@ -1628,18 +1664,18 @@ msgid ""
"Once you have added all the files you wanted to commit using :code:`git "
"add`, you can finally create your commit using this command:"
msgstr ""
-":code:`git add`를 사용하여 커밋하려는 모든 파일을 추가한 후, 마지막으로 이 "
-"명령을 사용하여 커밋을 생성할 수 있습니다:"
+":code:`git add`를 사용하여 커밋하려는 모든 파일을 추가한 후, 마지막으로 이 명"
+"령을 사용하여 커밋을 생성할 수 있습니다:"
#: ../../source/contributor-tutorial-contribute-on-github.rst:159
msgid ""
-"The \\ is there to explain to others what the commit "
-"does. It should be written in an imperative style and be concise. An "
-"example would be :code:`git commit -m \"Add images to README\"`."
+"The \\ is there to explain to others what the commit does. "
+"It should be written in an imperative style and be concise. An example would "
+"be :code:`git commit -m \"Add images to README\"`."
msgstr ""
-"커밋의 내용을 다른 사람에게 설명하기 위해 \\가 있습니다. "
-"명령형 스타일로 작성해야 하며 간결해야 합니다. 예를 들면 :code:`git commit -"
-"m \"Add images to README\"`."
+"커밋의 내용을 다른 사람에게 설명하기 위해 \\가 있습니다. 명"
+"령형 스타일로 작성해야 하며 간결해야 합니다. 예를 들면 :code:`git commit -m "
+"\"Add images to README\"`."
#: ../../source/contributor-tutorial-contribute-on-github.rst:171
msgid "**Push the changes to the fork**"
@@ -1647,19 +1683,20 @@ msgstr "**변경 사항을 포크에 푸시**"
#: ../../source/contributor-tutorial-contribute-on-github.rst:163
msgid ""
-"Once we have committed our changes, we have effectively updated our local"
-" history, but GitHub has no way of knowing this unless we push our "
-"changes to our origin's remote address:"
+"Once we have committed our changes, we have effectively updated our local "
+"history, but GitHub has no way of knowing this unless we push our changes to "
+"our origin's remote address:"
msgstr ""
-"변경 사항을 커밋하면 로컬 히스토리를 효과적으로 업데이트한 것이지만, 변경 "
-"사항을 원본의 원격 주소로 푸시하지 않는 한 GitHub는 이를 알 방법이 없습니다:"
+"변경 사항을 커밋하면 로컬 히스토리를 효과적으로 업데이트한 것이지만, 변경 사"
+"항을 원본의 원격 주소로 푸시하지 않는 한 GitHub는 이를 알 방법이 없습니다:"
#: ../../source/contributor-tutorial-contribute-on-github.rst:170
msgid ""
"Once this is done, you will see on the GitHub that your forked repo was "
"updated with the changes you have made."
-msgstr "이 작업이 완료되면 변경한 내용으로 포크된 레포지토리가 업데이트된 것을 "
-"GitHub에서 확인할 수 있습니다."
+msgstr ""
+"이 작업이 완료되면 변경한 내용으로 포크된 레포지토리가 업데이트된 것을 GitHub"
+"에서 확인할 수 있습니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:174
msgid "Creating and merging a pull request (PR)"
@@ -1671,39 +1708,43 @@ msgstr "**PR 만들기**"
#: ../../source/contributor-tutorial-contribute-on-github.rst:177
msgid ""
-"Once you have pushed changes, on the GitHub webpage of your repository "
-"you should see the following message:"
-msgstr "변경 사항을 푸시하고 나면 레포지토리의 GitHub 웹페이지에 다음 메시지가 "
-"표시됩니다:"
+"Once you have pushed changes, on the GitHub webpage of your repository you "
+"should see the following message:"
+msgstr ""
+"변경 사항을 푸시하고 나면 레포지토리의 GitHub 웹페이지에 다음 메시지가 표시됩"
+"니다:"
#: ../../source/contributor-tutorial-contribute-on-github.rst:181
msgid "Otherwise you can always find this option in the ``Branches`` page."
-msgstr "그렇지 않으면 언제든지 ``Branches`` 페이지에서 이 옵션을 찾을 수 있습니다."
+msgstr ""
+"그렇지 않으면 언제든지 ``Branches`` 페이지에서 이 옵션을 찾을 수 있습니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:183
msgid ""
"Once you click the ``Compare & pull request`` button, you should see "
"something similar to this:"
-msgstr "``Compare & pull request`` 버튼을 클릭하면 이와 비슷한 화면이 표시됩니다:"
+msgstr ""
+"``Compare & pull request`` 버튼을 클릭하면 이와 비슷한 화면이 표시됩니다:"
#: ../../source/contributor-tutorial-contribute-on-github.rst:187
-msgid "At the top you have an explanation of which branch will be merged where:"
+msgid ""
+"At the top you have an explanation of which branch will be merged where:"
msgstr "상단에는 어느 지점이 어디에 병합될 것인지에 대한 설명이 있습니다:"
#: ../../source/contributor-tutorial-contribute-on-github.rst:191
msgid ""
-"In this example you can see that the request is to merge the branch "
-"``doc-fixes`` from my forked repository to branch ``main`` from the "
-"Flower repository."
+"In this example you can see that the request is to merge the branch ``doc-"
+"fixes`` from my forked repository to branch ``main`` from the Flower "
+"repository."
msgstr ""
-"이 예제에서는 내 포크된 레포지토리의 ``doc-fixes`` 브랜치를 Flower "
-"레포지토리의 ``main`` 브랜치에 병합하라는 요청을 볼 수 있습니다."
+"이 예제에서는 내 포크된 레포지토리의 ``doc-fixes`` 브랜치를 Flower 레포지토리"
+"의 ``main`` 브랜치에 병합하라는 요청을 볼 수 있습니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:193
msgid ""
"The title should be changed to adhere to the :ref:`pr_title_format` "
-"guidelines, otherwise it won't be possible to merge the PR. So in this "
-"case, a correct title might be ``docs(framework:skip) Fix typos``."
+"guidelines, otherwise it won't be possible to merge the PR. So in this case, "
+"a correct title might be ``docs(framework:skip) Fix typos``."
msgstr ""
"제목은 :ref:`pr_title_format` 가이드라인을 준수하도록 변경해야 하며, 그렇지 "
"않으면 PR을 병합할 수 없습니다. 따라서 이 경우 올바른 제목은 "
@@ -1711,14 +1752,13 @@ msgstr ""
#: ../../source/contributor-tutorial-contribute-on-github.rst:196
msgid ""
-"The input box in the middle is there for you to describe what your PR "
-"does and to link it to existing issues. We have placed comments (that "
-"won't be rendered once the PR is opened) to guide you through the "
-"process."
+"The input box in the middle is there for you to describe what your PR does "
+"and to link it to existing issues. We have placed comments (that won't be "
+"rendered once the PR is opened) to guide you through the process."
msgstr ""
-"가운데에 있는 입력 상자는 PR의 기능을 설명하고 기존 이슈에 연결할 수 있는 "
-"곳입니다. 프로세스를 안내하기 위해 코멘트(PR이 열리면 렌더링되지 않음)를 "
-"배치했습니다."
+"가운데에 있는 입력 상자는 PR의 기능을 설명하고 기존 이슈에 연결할 수 있는 곳"
+"입니다. 프로세스를 안내하기 위해 코멘트(PR이 열리면 렌더링되지 않음)를 배치했"
+"습니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:199
msgid "It is important to follow the instructions described in comments."
@@ -1727,16 +1767,16 @@ msgstr "코멘트에 설명된 지침을 따르는 것이 중요합니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:201
msgid ""
"At the bottom you will find the button to open the PR. This will notify "
-"reviewers that a new PR has been opened and that they should look over it"
-" to merge or to request changes."
+"reviewers that a new PR has been opened and that they should look over it to "
+"merge or to request changes."
msgstr ""
"하단에는 PR을 여는 버튼이 있습니다. 이렇게 하면 검토자에게 새 PR이 열렸으며 "
"병합하거나 변경을 요청하기 위해 검토해야 함을 알립니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:204
msgid ""
-"If your PR is not yet ready for review, and you don't want to notify "
-"anyone, you have the option to create a draft pull request:"
+"If your PR is not yet ready for review, and you don't want to notify anyone, "
+"you have the option to create a draft pull request:"
msgstr ""
"PR이 아직 검토할 준비가 되지 않았고 다른 사람에게 알리고 싶지 않은 경우 pull "
"request 초안을 만드는 옵션이 있습니다:"
@@ -1748,10 +1788,11 @@ msgstr "**new changes 만들기**"
#: ../../source/contributor-tutorial-contribute-on-github.rst:209
msgid ""
"Once the PR has been opened (as draft or not), you can still push new "
-"commits to it the same way we did before, by making changes to the branch"
-" associated with the PR."
-msgstr "PR이 초안으로 열렸든 아니든, PR과 연결된 브랜치를 변경하여 이전과 같은 "
-"방식으로 새 커밋을 푸시할 수 있습니다."
+"commits to it the same way we did before, by making changes to the branch "
+"associated with the PR."
+msgstr ""
+"PR이 초안으로 열렸든 아니든, PR과 연결된 브랜치를 변경하여 이전과 같은 방식으"
+"로 새 커밋을 푸시할 수 있습니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:231
msgid "**Review the PR**"
@@ -1759,17 +1800,19 @@ msgstr "**PR 검토하기**"
#: ../../source/contributor-tutorial-contribute-on-github.rst:212
msgid ""
-"Once the PR has been opened or once the draft PR has been marked as "
-"ready, a review from code owners will be automatically requested:"
-msgstr "PR이 열리거나 초안 PR이 준비됨으로 표시되면 코드 소유자의 검토가 자동으로 "
-"요청됩니다:"
+"Once the PR has been opened or once the draft PR has been marked as ready, a "
+"review from code owners will be automatically requested:"
+msgstr ""
+"PR이 열리거나 초안 PR이 준비됨으로 표시되면 코드 소유자의 검토가 자동으로 요"
+"청됩니다:"
#: ../../source/contributor-tutorial-contribute-on-github.rst:216
msgid ""
-"Code owners will then look into the code, ask questions, request changes "
-"or validate the PR."
-msgstr "그러면 코드 소유자는 코드를 살펴보고, 질문하고, 변경을 요청하거나 PR의 "
-"유효성을 검사합니다."
+"Code owners will then look into the code, ask questions, request changes or "
+"validate the PR."
+msgstr ""
+"그러면 코드 소유자는 코드를 살펴보고, 질문하고, 변경을 요청하거나 PR의 유효성"
+"을 검사합니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:218
msgid "Merging will be blocked if there are ongoing requested changes."
@@ -1777,9 +1820,10 @@ msgstr "진행 중인 변경 요청이 있는 경우 병합이 차단됩니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:222
msgid ""
-"To resolve them, just push the necessary changes to the branch associated"
-" with the PR:"
-msgstr "이를 해결하려면 PR과 연결된 브랜치에 필요한 변경 사항을 푸시하면 됩니다:"
+"To resolve them, just push the necessary changes to the branch associated "
+"with the PR:"
+msgstr ""
+"이를 해결하려면 PR과 연결된 브랜치에 필요한 변경 사항을 푸시하면 됩니다:"
#: ../../source/contributor-tutorial-contribute-on-github.rst:226
msgid "And resolve the conversation:"
@@ -1787,8 +1831,7 @@ msgstr "그리고 소통을 통해 해결하세요:"
#: ../../source/contributor-tutorial-contribute-on-github.rst:230
msgid ""
-"Once all the conversations have been resolved, you can re-request a "
-"review."
+"Once all the conversations have been resolved, you can re-request a review."
msgstr "모든 대화가 해결되면 검토를 다시 요청할 수 있습니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:251
@@ -1797,16 +1840,18 @@ msgstr "**PR이 병합되면**"
#: ../../source/contributor-tutorial-contribute-on-github.rst:234
msgid ""
-"If all the automatic tests have passed and reviewers have no more changes"
-" to request, they can approve the PR and merge it."
-msgstr "모든 자동 테스트가 통과되고 검토자가 더 이상 요청할 변경 사항이 없는 경우 "
-"PR을 승인하고 병합할 수 있습니다."
+"If all the automatic tests have passed and reviewers have no more changes to "
+"request, they can approve the PR and merge it."
+msgstr ""
+"모든 자동 테스트가 통과되고 검토자가 더 이상 요청할 변경 사항이 없는 경우 PR"
+"을 승인하고 병합할 수 있습니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:238
msgid ""
"Once it is merged, you can delete the branch on GitHub (a button should "
"appear to do so) and also delete it locally by doing:"
-msgstr "병합이 완료되면 GitHub에서 브랜치를 삭제할 수 있으며(삭제 버튼이 표시되어야 "
+msgstr ""
+"병합이 완료되면 GitHub에서 브랜치를 삭제할 수 있으며(삭제 버튼이 표시되어야 "
"함), 로컬에서도 삭제할 수 있습니다:"
#: ../../source/contributor-tutorial-contribute-on-github.rst:245
@@ -1823,40 +1868,43 @@ msgstr "문제"
#: ../../source/contributor-tutorial-contribute-on-github.rst:259
msgid ""
-"For our documentation, we've started to use the `Diàtaxis framework "
-"`_."
-msgstr "저희 문서에는 'Diàtaxis 프레임워크 `_'를 사용하기 "
-"시작했습니다."
+"For our documentation, we've started to use the `Diàtaxis framework `_."
+msgstr ""
+"저희 문서에는 'Diàtaxis 프레임워크 `_'를 사용하기 시작"
+"했습니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:261
msgid ""
-"Our \"How to\" guides should have titles that continue the sentence \"How"
-" to …\", for example, \"How to upgrade to Flower 1.0\"."
+"Our \"How to\" guides should have titles that continue the sentence \"How to "
+"…\", for example, \"How to upgrade to Flower 1.0\"."
msgstr ""
-"'How to' 가이드의 제목은 \"How to …\"라는 문장을 이어가는 제목이어야 "
-"합니다(예: \"How to upgrade to Flower 1.0\")."
+"'How to' 가이드의 제목은 \"How to …\"라는 문장을 이어가는 제목이어야 합니다"
+"(예: \"How to upgrade to Flower 1.0\")."
#: ../../source/contributor-tutorial-contribute-on-github.rst:263
msgid ""
"Most of our guides do not follow this new format yet, and changing their "
"title is (unfortunately) more involved than one might think."
-msgstr "대부분의 가이드는 아직 이 새로운 형식을 따르지 않으며, 안타깝게도 제목을 "
-"변경하는 작업은 생각보다 복잡합니다."
+msgstr ""
+"대부분의 가이드는 아직 이 새로운 형식을 따르지 않으며, 안타깝게도 제목을 변경"
+"하는 작업은 생각보다 복잡합니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:265
msgid ""
-"This issue is about changing the title of a doc from present continuous "
-"to present simple."
-msgstr "이번 이슈는 문서 제목을 현재 연속형에서 현재 단순형으로 변경하는 것에 관한 "
-"것입니다."
+"This issue is about changing the title of a doc from present continuous to "
+"present simple."
+msgstr ""
+"이번 이슈는 문서 제목을 현재 연속형에서 현재 단순형으로 변경하는 것에 관한 것"
+"입니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:267
msgid ""
"Let's take the example of \"Saving Progress\" which we changed to \"Save "
"Progress\". Does this pass our check?"
msgstr ""
-"\"How to saving progress\"을 \"How to save progress\"으로 변경한 예를 들어 "
-"보겠습니다. 이것이 우리의 점검을 통과했나요?"
+"\"How to saving progress\"을 \"How to save progress\"으로 변경한 예를 들어 보"
+"겠습니다. 이것이 우리의 점검을 통과했나요?"
#: ../../source/contributor-tutorial-contribute-on-github.rst:269
msgid "Before: \"How to saving progress\" ❌"
@@ -1876,7 +1924,7 @@ msgid ""
"After cloning and setting up the Flower repo, here's what you should do:"
msgstr ""
"이것은 사소한 변경이지만 end-to-end 설정을 테스트할 수 있습니다. Flower "
-"포지토리를 복제하고 설정한 후에는 다음과 같이 하세요:"
+"레포지토리를 복제하고 설정한 후에는 다음과 같이 하세요:"
#: ../../source/contributor-tutorial-contribute-on-github.rst:278
msgid "Find the source file in ``doc/source``"
@@ -1886,13 +1934,14 @@ msgstr "``doc/source``에서 소스 파일을 찾습니다"
msgid ""
"Make the change in the ``.rst`` file (beware, the dashes under the title "
"should be the same length as the title itself)"
-msgstr "``.rst`` 파일에서 변경합니다(제목 아래의 대시는 제목 자체의 길이와 같아야 "
-"합니다)"
+msgstr ""
+"``.rst`` 파일에서 변경합니다(제목 아래의 대시는 제목 자체의 길이와 같아야 합"
+"니다)"
#: ../../source/contributor-tutorial-contribute-on-github.rst:280
msgid ""
-"Build the docs and `check the result `_"
+"Build the docs and `check the result `_"
msgstr ""
"문서를 빌드하고 '결과 확인 `_'합니다"
@@ -1903,14 +1952,14 @@ msgstr "파일 이름 바꾸기"
#: ../../source/contributor-tutorial-contribute-on-github.rst:285
msgid ""
-"You might have noticed that the file name still reflects the old wording."
-" If we just change the file, then we break all existing links to it - it "
-"is **very important** to avoid that, breaking links can harm our search "
-"engine ranking."
+"You might have noticed that the file name still reflects the old wording. If "
+"we just change the file, then we break all existing links to it - it is "
+"**very important** to avoid that, breaking links can harm our search engine "
+"ranking."
msgstr ""
-"파일 이름에 여전히 이전 문구가 반영되어 있는 것을 보셨을 것입니다. 파일만 "
-"변경하면 파일에 대한 기존 링크가 모두 끊어지는데, 링크를 끊으면 검색 엔진 "
-"순위에 영향을 줄 수 있으므로 이를 방지하는 것이 **매우 중요**합니다."
+"파일 이름에 여전히 이전 문구가 반영되어 있는 것을 보셨을 것입니다. 파일만 변"
+"경하면 파일에 대한 기존 링크가 모두 끊어지는데, 링크를 끊으면 검색 엔진 순위"
+"에 영향을 줄 수 있으므로 이를 방지하는 것이 **매우 중요**합니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:288
msgid "Here's how to change the file name:"
@@ -1926,11 +1975,11 @@ msgstr "'doc/source/conf.py'에 리디렉션 규칙을 추가합니다"
#: ../../source/contributor-tutorial-contribute-on-github.rst:293
msgid ""
-"This will cause a redirect from ``saving-progress.html`` to ``save-"
-"progress.html``, old links will continue to work."
+"This will cause a redirect from ``saving-progress.html`` to ``save-progress."
+"html``, old links will continue to work."
msgstr ""
-"이렇게 하면 ``saving-progress.html``에서 ``save-progress.html``로 "
-"리디렉션되며, 이전 링크는 계속 작동합니다."
+"이렇게 하면 ``saving-progress.html``에서 ``save-progress.html``로 리디렉션되"
+"며, 이전 링크는 계속 작동합니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:296
msgid "Apply changes in the index file"
@@ -1942,8 +1991,8 @@ msgid ""
"update the ``index.rst`` file as well. This is where we define the whole "
"arborescence of the navbar."
msgstr ""
-"횡방향 내비게이션 바가 제대로 작동하려면 ``index.rst`` 파일도 업데이트하는 "
-"것이 매우 중요합니다. 이 파일은 탐색 모음의 전체 배열을 정의하는 곳입니다."
+"횡방향 내비게이션 바가 제대로 작동하려면 ``index.rst`` 파일도 업데이트하는 것"
+"이 매우 중요합니다. 이 파일은 탐색 모음의 전체 배열을 정의하는 곳입니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:301
msgid "Find and modify the file name in ``index.rst``"
@@ -1955,11 +2004,11 @@ msgstr "PR 열기"
#: ../../source/contributor-tutorial-contribute-on-github.rst:306
msgid ""
-"Commit the changes (commit messages are always imperative: \"Do "
-"something\", in this case \"Change …\")"
+"Commit the changes (commit messages are always imperative: \"Do something\", "
+"in this case \"Change …\")"
msgstr ""
-"변경 사항을 커밋합니다(커밋 메시지는 항상 필수 메시지입니다:\"Do something\"("
-"이 경우 는 \"Change …\" )"
+"변경 사항을 커밋합니다(커밋 메시지는 항상 필수 메시지입니다:\"Do "
+"something\"(이 경우 는 \"Change …\" )"
#: ../../source/contributor-tutorial-contribute-on-github.rst:307
msgid "Push the changes to your fork"
@@ -1967,9 +2016,10 @@ msgstr "변경 사항을 포크에 푸시합니다"
#: ../../source/contributor-tutorial-contribute-on-github.rst:308
msgid ""
-"Open a PR (as shown above) with title ``docs(framework) Update how-to "
-"guide title``"
-msgstr "``docs(framework) Update how-to guide title`` 제목으로 PR(위와 같이)을 엽니다"
+"Open a PR (as shown above) with title ``docs(framework) Update how-to guide "
+"title``"
+msgstr ""
+"``docs(framework) Update how-to guide title`` 제목으로 PR(위와 같이)을 엽니다"
#: ../../source/contributor-tutorial-contribute-on-github.rst:309
msgid "Wait for it to be approved!"
@@ -1990,18 +2040,17 @@ msgstr "다음 단계"
#: ../../source/contributor-tutorial-contribute-on-github.rst:316
msgid ""
-"Once you have made your first PR, and want to contribute more, be sure to"
-" check out the following :"
-msgstr "첫 번째 PR을 작성하고 더 많은 기여를 하고 싶다면 다음 을 확인하세요:"
+"Once you have made your first PR, and want to contribute more, be sure to "
+"check out the following :"
+msgstr "첫 번째 PR을 작성하고 더 많은 기여를 하고 싶다면 다음을 확인하세요:"
#: ../../source/contributor-tutorial-contribute-on-github.rst:318
msgid ""
-":doc:`Good first contributions `, where you should particularly look into the "
-":code:`baselines` contributions."
+":doc:`Good first contributions `, "
+"where you should particularly look into the :code:`baselines` contributions."
msgstr ""
-":doc:`훌륭한 첫 번째 기여 `, 특히 "
-":code:`baselines` 기여를 살펴봐야 합니다."
+":doc:`훌륭한 첫 번째 기여 `, 특히 :"
+"code:`baselines` 기여를 살펴봐야 합니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:322
#: ../../source/fed/0000-20200102-fed-template.md:60
@@ -2018,23 +2067,23 @@ msgstr "다음과 같은 PR 제목 형식을 적용합니다:"
#: ../../source/contributor-tutorial-contribute-on-github.rst:335
msgid ""
-"(or ``(:skip) `` to ignore the PR in the "
-"changelog)"
-msgstr "(또는 ``(:skip) ``를 사용하면 변경 로그에서 PR을 "
-"무시합니다.)"
+"(or ``(:skip) `` to ignore the PR in the changelog)"
+msgstr ""
+"(또는 ``(:skip) ``를 사용하면 변경 로그에서 PR을 무시"
+"합니다.)"
#: ../../source/contributor-tutorial-contribute-on-github.rst:337
msgid ""
-"Where ```` needs to be in ``{ci, fix, feat, docs, refactor, "
-"break}``, ```` should be in ``{framework, baselines, datasets, "
-"examples, or '*' when modifying multiple projects which requires the "
-"':skip' flag to be used}``, and ```` starts with a capitalised "
-"verb in the imperative mood."
+"Where ```` needs to be in ``{ci, fix, feat, docs, refactor, break}``, "
+"```` should be in ``{framework, baselines, datasets, examples, or "
+"'*' when modifying multiple projects which requires the ':skip' flag to be "
+"used}``, and ```` starts with a capitalised verb in the imperative "
+"mood."
msgstr ""
"여기서 ````은 ``{ci, fix, feat, docs, refactor, break}``, ````"
-"는 ``{framework, baselines, datasets, examples, or '*' ':skip' 플래그를 "
-"사용해야 하는 여러 프로젝트를 수정하는 경우}``로 입력해야 하며, ````"
-"는 대문자로 시작해야 합니다."
+"는 ``{framework, baselines, datasets, examples, or '*' ':skip' 플래그를 사용"
+"해야 하는 여러 프로젝트를 수정하는 경우}``로 입력해야 하며, ````는 "
+"대문자로 시작해야 합니다."
#: ../../source/contributor-tutorial-contribute-on-github.rst:341
msgid "Valid examples:"
@@ -2054,7 +2103,7 @@ msgstr "``ci(*:skip) Enforce PR title format``"
#: ../../source/contributor-tutorial-contribute-on-github.rst:347
msgid "Invalid examples:"
-msgstr "잘못된 예제입니다:"
+msgstr "잘못된 예시입니다:"
#: ../../source/contributor-tutorial-contribute-on-github.rst:349
msgid "``feat(framework): Add flwr build CLI command`` (extra ``:``)"
@@ -2064,7 +2113,8 @@ msgstr "``feat(framework): Add flwr build CLI command`` ( ``:``제외)"
msgid ""
"``feat(*) Add flwr build CLI command`` (missing ``skip`` flag along with "
"``*``)"
-msgstr "``feat(*) Add flwr build CLI command`` (``skip`` flag와 함께 ``*``누락)"
+msgstr ""
+"``feat(*) Add flwr build CLI command`` (``skip`` flag와 함께 ``*``누락)"
#: ../../source/contributor-tutorial-contribute-on-github.rst:351
msgid "``feat(skip) Add flwr build CLI command`` (missing ````)"
@@ -2072,7 +2122,8 @@ msgstr "``feat(skip) Add flwr build CLI command`` (````누락)"
#: ../../source/contributor-tutorial-contribute-on-github.rst:352
msgid "``feat(framework) add flwr build CLI command`` (non capitalised verb)"
-msgstr "``feat(framework) add flwr build CLI command`` (대문자로 표기되지 않은 동사)"
+msgstr ""
+"``feat(framework) add flwr build CLI command`` (대문자로 표기되지 않은 동사)"
#: ../../source/contributor-tutorial-contribute-on-github.rst:353
msgid "``feat(framework) Add flwr build CLI command.`` (dot at the end)"
@@ -2104,17 +2155,19 @@ msgid "(Optional) `pyenv `_"
msgstr "(선택 사항) `pyenv `_"
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:10
-msgid "(Optional) `pyenv-virtualenv `_"
-msgstr "(선택 사항) `pyenv-virtualenv `_"
+msgid ""
+"(Optional) `pyenv-virtualenv `_"
+msgstr ""
+"(선택 사항) `pyenv-virtualenv `_"
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:12
msgid ""
"Flower uses :code:`pyproject.toml` to manage dependencies and configure "
-"development tools (the ones which support it). Poetry is a build tool "
-"which supports `PEP 517 `_."
+"development tools (the ones which support it). Poetry is a build tool which "
+"supports `PEP 517 `_."
msgstr ""
-"Flower는 dependencies을 관리하고 개발 도구(이를 지원하는 도구)를 구성하기 "
-"위해 :code:`pyproject.toml`을 사용합니다. Poetry는 `PEP 517 `_을 지원하는 빌드 도구입니다."
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:18
@@ -2127,7 +2180,7 @@ msgstr "사전 준비"
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:22
msgid "Some system-wide dependencies are needed."
-msgstr "일부 시스템 전체에 대한 dependencies이 필요합니다."
+msgstr "일부 시스템 전체에 대한 의존성이 필요합니다."
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:25
msgid "For macOS"
@@ -2135,17 +2188,18 @@ msgstr "macOS의 경우"
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:27
msgid ""
-"Install `homebrew `_. Don't forget the post-"
-"installation actions to add `brew` to your PATH."
+"Install `homebrew `_. Don't forget the post-installation "
+"actions to add `brew` to your PATH."
msgstr ""
-"`homebrew `_를 설치합니다. 설치 후 `brew`를 PATH에 "
-"추가하는 작업을 잊지 마세요."
+"`homebrew `_를 설치합니다. 설치 후 `brew`를 PATH에 추가하"
+"는 작업을 잊지 마세요."
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:28
msgid ""
-"Install `xz` (to install different Python versions) and `pandoc` to build"
-" the docs::"
-msgstr "xz`(다른 Python 버전을 설치하려면)와 `pandoc`을 설치하여 문서를 빌드합니다::"
+"Install `xz` (to install different Python versions) and `pandoc` to build "
+"the docs::"
+msgstr ""
+"xz`(다른 Python 버전을 설치하려면)와 `pandoc`을 설치하여 문서를 빌드합니다::"
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:34
msgid "For Ubuntu"
@@ -2153,10 +2207,11 @@ msgstr "Ubuntu의 경우"
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:35
msgid ""
-"Ensure you system (Ubuntu 22.04+) is up-to-date, and you have all "
-"necessary packages::"
-msgstr "시스템(우분투 22.04 이상)이 최신 상태이고 필요한 패키지가 모두 설치되어 "
-"있는지 확인하세요:"
+"Ensure you system (Ubuntu 22.04+) is up-to-date, and you have all necessary "
+"packages::"
+msgstr ""
+"시스템(우분투 22.04 이상)이 최신 상태이고 필요한 패키지가 모두 설치되어 있는"
+"지 확인하세요:"
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:44
msgid "Create Flower Dev Environment"
@@ -2167,27 +2222,27 @@ msgid ""
"1. Clone the `Flower repository `_ from "
"GitHub::"
msgstr ""
-"1. GitHub: 에서 ``Flower 레포지토리 `_를 "
-"복제합니다::"
+"1. GitHub: 에서 ``Flower 레포지토리 `_를 복제"
+"합니다::"
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:52
msgid ""
-"Let's create the Python environment for all-things Flower. If you wish to"
-" use :code:`pyenv`, we provide two convenience scripts that you can use. "
-"If you prefer using something else than :code:`pyenv`, create a new "
+"Let's create the Python environment for all-things Flower. If you wish to "
+"use :code:`pyenv`, we provide two convenience scripts that you can use. If "
+"you prefer using something else than :code:`pyenv`, create a new "
"environment, activate and skip to the last point where all packages are "
"installed."
msgstr ""
-"Flower의 모든 것을 위한 파이썬 환경을 만들어 보겠습니다.:code:`pyenv`를 "
-"사용하고자 하는 경우 사용할 수 있는 두 가지 편의 스크립트를 "
-"제공합니다.:code:`pyenv`가 아닌 다른 것을 사용하려면 새 환경을 생성하고 "
-"활성화한 후 모든 패키지가 설치된 마지막 지점으로 건너뛰세요."
+"Flower의 모든 것을 위한 파이썬 환경을 만들어 보겠습니다.:code:`pyenv`를 사용"
+"하고자 하는 경우 사용할 수 있는 두 가지 편의 스크립트를 제공합니다.:code:"
+"`pyenv`가 아닌 다른 것을 사용하려면 새 환경을 생성하고 활성화한 후 모든 패키"
+"지가 설치된 마지막 지점으로 건너뛰세요."
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:54
msgid ""
-"If you don't have :code:`pyenv` installed, the following script that will"
-" install it, set it up, and create the virtual environment (with "
-":code:`Python 3.8.17` by default)::"
+"If you don't have :code:`pyenv` installed, the following script that will "
+"install it, set it up, and create the virtual environment (with :code:"
+"`Python 3.8.17` by default)::"
msgstr ""
":code:`pyenv`가 설치되어 있지 않은 경우 다음 스크립트를 사용하여 설치, 설정 "
"및 가상 환경을 생성합니다(기본적으로 :code:`Python 3.8.17` 사용):"
@@ -2195,8 +2250,8 @@ msgstr ""
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:58
msgid ""
"If you already have :code:`pyenv` installed (along with the :code:`pyenv-"
-"virtualenv` plugin), you can use the following convenience script (with "
-":code:`Python 3.8.17` by default)::"
+"virtualenv` plugin), you can use the following convenience script (with :"
+"code:`Python 3.8.17` by default)::"
msgstr ""
":code:`pyenv`가 이미 설치되어 있는 경우( :code:`pyenv-virtualenv` 플러그인과 "
"함께) 다음과 같은 편의 스크립트를 사용할 수 있습니다(기본적으로 코드:`Python "
@@ -2204,11 +2259,11 @@ msgstr ""
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:62
msgid ""
-"3. Install the Flower package in development mode (think :code:`pip "
-"install -e`) along with all necessary dependencies::"
+"3. Install the Flower package in development mode (think :code:`pip install -"
+"e`) along with all necessary dependencies::"
msgstr ""
-"3. 필요한 모든 dependencies와 함께 개발 모드에서 Flower 패키지를 "
-"설치합니다(예:code:`pip install -e`)::"
+"3. 필요한 모든 dependencies와 함께 개발 모드에서 Flower 패키지를 설치합니다"
+"(예:code:`pip install -e`)::"
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:69
msgid "Convenience Scripts"
@@ -2217,13 +2272,13 @@ msgstr "편의 스크립트"
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:71
msgid ""
"The Flower repository contains a number of convenience scripts to make "
-"recurring development tasks easier and less error-prone. See the "
-":code:`/dev` subdirectory for a full list. The following scripts are "
-"amongst the most important ones:"
+"recurring development tasks easier and less error-prone. See the :code:`/"
+"dev` subdirectory for a full list. The following scripts are amongst the "
+"most important ones:"
msgstr ""
-"Flower 레포지토리에는 반복적인 개발 작업을 더 쉽고 오류를 줄이기 위한 여러 "
-"가지 편의 스크립트가 포함되어 있습니다. 전체 목록은 :code:`/dev` 하위 "
-"디렉터리를 참조하세요. 다음 스크립트는 가장 중요한 스크립트 중 하나입니다:"
+"Flower 레포지토리에는 반복적인 개발 작업을 더 쉽고 오류를 줄이기 위한 여러 가"
+"지 편의 스크립트가 포함되어 있습니다. 전체 목록은 :code:`/dev` 하위 디렉터리"
+"를 참조하세요. 다음 스크립트는 가장 중요한 스크립트 중 하나입니다:"
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:77
msgid "Create/Delete Virtual Environment"
@@ -2247,50 +2302,53 @@ msgstr "사전 커밋 훅 추가"
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:108
msgid ""
-"Developers may integrate a pre-commit hook into their workflow utilizing "
-"the `pre-commit `_ library. The pre-"
-"commit hook is configured to execute two primary operations: "
-"``./dev/format.sh`` and ``./dev/test.sh`` scripts."
+"Developers may integrate a pre-commit hook into their workflow utilizing the "
+"`pre-commit `_ library. The pre-commit hook "
+"is configured to execute two primary operations: ``./dev/format.sh`` and ``./"
+"dev/test.sh`` scripts."
msgstr ""
-"개발자는 `pre-commit `_ 라이브러리를 "
-"사용하여 사전 커밋 훅을 워크플로에 통합할 수 있습니다. 사전 커밋 훅은 두 "
-"가지 기본 작업을 실행하도록 구성됩니다:``./dev/format.sh`` 및 ``./dev/test."
-"sh`` 스크립트."
+"개발자는 `pre-commit `_ 라이브러리를 사용하"
+"여 사전 커밋 훅을 워크플로에 통합할 수 있습니다. 사전 커밋 훅은 두 가지 기본 "
+"작업을 실행하도록 구성됩니다:``./dev/format.sh`` 및 ``./dev/test.sh`` 스크립"
+"트."
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:110
msgid "There are multiple ways developers can use this:"
msgstr "개발자가 이것을 사용할 수 있는 여러가지 방법이 있습니다:"
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:112
-msgid "Install the pre-commit hook to your local git directory by simply running:"
+msgid ""
+"Install the pre-commit hook to your local git directory by simply running:"
msgstr "간단하게 실행하여 로컬 git 디렉터리에 사전 커밋 훅을 설치하세요:"
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:118
msgid ""
-"Each ``git commit`` will trigger the execution of formatting and "
-"linting/test scripts."
+"Each ``git commit`` will trigger the execution of formatting and linting/"
+"test scripts."
msgstr "각 ``git 커밋``은 포맷 및 린팅/테스트 스크립트의 실행을 트리거합니다."
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:119
msgid ""
-"If in a hurry, bypass the hook using ``--no-verify`` with the ``git "
-"commit`` command. ::"
-msgstr "급한 경우 ``git commit`` 명령과 함께 `--no-verify``를 사용하여 훅을 넘기세요:"
+"If in a hurry, bypass the hook using ``--no-verify`` with the ``git commit`` "
+"command. ::"
+msgstr ""
+"급한 경우 ``git commit`` 명령과 함께 `--no-verify``를 사용하여 훅을 넘기세요:"
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:124
msgid ""
"For developers who prefer not to install the hook permanently, it is "
-"possible to execute a one-time check prior to committing changes by using"
-" the following command:"
+"possible to execute a one-time check prior to committing changes by using "
+"the following command:"
msgstr ""
-"훅을 영구적으로 설치하지 않으려는 개발자의 경우 다음 명령을 사용하여 변경 "
-"사항을 커밋하기 전에 일회성 검사를 실행할 수 있습니다:"
+"훅을 영구적으로 설치하지 않으려는 개발자의 경우 다음 명령을 사용하여 변경 사"
+"항을 커밋하기 전에 일회성 검사를 실행할 수 있습니다:"
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:130
msgid ""
"This executes the formatting and linting checks/tests on all the files "
"without modifying the default behavior of ``git commit``."
-msgstr "이렇게 하면 ``git commit``의 기본 동작을 수정하지 않고 모든 파일에 대해 포맷 "
+msgstr ""
+"이렇게 하면 ``git commit``의 기본 동작을 수정하지 않고 모든 파일에 대해 포맷 "
"및 린팅 검사/테스트를 실행합니다."
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:133
@@ -2299,21 +2357,22 @@ msgstr "로컬에서 Github Action(CI) 실행하기"
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:135
msgid ""
-"Developers could run the full set of Github Actions workflows under their"
-" local environment by using `Act `_. "
-"Please refer to the installation instructions under the linked repository"
-" and run the next command under Flower main cloned repository folder::"
+"Developers could run the full set of Github Actions workflows under their "
+"local environment by using `Act `_. Please "
+"refer to the installation instructions under the linked repository and run "
+"the next command under Flower main cloned repository folder::"
msgstr ""
-"개발자는 `Act `_를 사용하여 로컬 환경에서 "
-"전체 Github Actions 워크플로우 세트를 실행할 수 있습니다. 링크된 레포지토리 "
-"아래의 설치 지침을 참조하여 Flower 메인 클론 레포지토리 폴더 아래에서 다음 "
-"명령을 실행하세요::"
+"개발자는 `Act `_를 사용하여 로컬 환경에서 전"
+"체 Github Actions 워크플로우 세트를 실행할 수 있습니다. 링크된 레포지토리 아"
+"래의 설치 지침을 참조하여 Flower 메인 클론 레포지토리 폴더 아래에서 다음 명령"
+"을 실행하세요::"
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:142
msgid ""
"The Flower default workflow would run by setting up the required Docker "
"machines underneath."
-msgstr "Flower 기본 워크플로우는 아래에 필요한 Docker 머신을 설정하여 실행합니다."
+msgstr ""
+"Flower 기본 워크플로우는 아래에 필요한 Docker 머신을 설정하여 실행합니다."
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:147
msgid "Build Release"
@@ -2321,17 +2380,19 @@ msgstr "릴리즈 빌드"
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:149
msgid ""
-"Flower uses Poetry to build releases. The necessary command is wrapped in"
-" a simple script::"
-msgstr "Flower는 Poetry를 사용하여 릴리즈를 빌드합니다. 필요한 명령은 간단한 "
-"스크립트로 래핑됩니다::"
+"Flower uses Poetry to build releases. The necessary command is wrapped in a "
+"simple script::"
+msgstr ""
+"Flower는 Poetry를 사용하여 릴리즈를 빌드합니다. 필요한 명령은 간단한 스크립트"
+"로 래핑됩니다::"
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:154
msgid ""
-"The resulting :code:`.whl` and :code:`.tar.gz` releases will be stored in"
-" the :code:`/dist` subdirectory."
-msgstr "결과물인 :code:`.whl` 및 :code:`.tar.gz` 릴리즈는 :code:`/dist` 하위 "
-"디렉터리에 저장됩니다."
+"The resulting :code:`.whl` and :code:`.tar.gz` releases will be stored in "
+"the :code:`/dist` subdirectory."
+msgstr ""
+"결과물인 :code:`.whl` 및 :code:`.tar.gz` 릴리즈는 :code:`/dist` 하위 디렉터리"
+"에 저장됩니다."
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:159
msgid "Build Documentation"
@@ -2339,13 +2400,13 @@ msgstr "문서 빌드"
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:161
msgid ""
-"Flower's documentation uses `Sphinx `_. "
-"There's no convenience script to re-build the documentation yet, but it's"
-" pretty easy::"
+"Flower's documentation uses `Sphinx `_. There's "
+"no convenience script to re-build the documentation yet, but it's pretty "
+"easy::"
msgstr ""
-"Flower의 문서는 `Sphinx `_를 사용합니다. 아직 "
-"문서를 다시 작성할 수 있는 편리한 스크립트는 없지만 다음과 같이 쉽게 작성할 "
-"수 있습니다:"
+"Flower의 문서는 `Sphinx `_를 사용합니다. 아직 문"
+"서를 다시 작성할 수 있는 편리한 스크립트는 없지만 다음과 같이 쉽게 작성할 수 "
+"있습니다:"
#: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:167
msgid "This will generate HTML documentation in ``doc/build/html``."
@@ -2353,40 +2414,39 @@ msgstr "그러면 ``doc/build/html``에 HTML 문서가 생성됩니다."
#: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:2
msgid "Example: FedBN in PyTorch - From Centralized To Federated"
-msgstr "예시: PyTorch에서 FedBN - Centralize에서 Federated으로"
+msgstr "예시: PyTorch에서 FedBN - 중앙 집중식에서 연합식으로"
#: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:4
msgid ""
-"This tutorial will show you how to use Flower to build a federated "
-"version of an existing machine learning workload with `FedBN "
-"`_, a federated training strategy "
-"designed for non-iid data. We are using PyTorch to train a Convolutional "
-"Neural Network(with Batch Normalization layers) on the CIFAR-10 dataset. "
-"When applying FedBN, only few changes needed compared to :doc:`Example: "
-"PyTorch - From Centralized To Federated `."
+"This tutorial will show you how to use Flower to build a federated version "
+"of an existing machine learning workload with `FedBN `_, a federated training strategy designed for non-iid data. We "
+"are using PyTorch to train a Convolutional Neural Network(with Batch "
+"Normalization layers) on the CIFAR-10 dataset. When applying FedBN, only few "
+"changes needed compared to :doc:`Example: PyTorch - From Centralized To "
+"Federated `."
msgstr ""
"이 튜토리얼에서는 non-iid data를 위해 설계된 federated 훈련 전략인 `FedBN "
"`_으로 기존 머신러닝 워크로드의 federated "
"버전을 구축하기 위해 Flower를 사용하는 방법을 보여드립니다. 우리는 PyTorch를 "
"사용하여 CIFAR-10 데이터 세트에서 컨볼루션 신경망(일괄 정규화 레이어 포함)을 "
-"훈련하고 있습니다. FedBN을 적용할 때, :doc:`예제: 파이토치 -Centralized에서 "
-"Federated으로 ` 와 비교했을 "
-"때 몇 가지 사항만 변경 하면 됩니다."
+"훈련하고 있습니다. FedBN을 적용할 때, :doc:`예제: 파이토치 -중앙 집중식에서 "
+"연합식으로 ` 와 비교했을 때 "
+"몇 가지 사항만 변경 하면 됩니다."
#: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:9
#: ../../source/example-pytorch-from-centralized-to-federated.rst:10
msgid "Centralized Training"
-msgstr "Centralized 훈련"
+msgstr "중앙 집중식 훈련"
#: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:10
msgid ""
-"All files are revised based on :doc:`Example: PyTorch - From Centralized "
-"To Federated `. The only "
-"thing to do is modifying the file called :code:`cifar.py`, revised part "
-"is shown below:"
+"All files are revised based on :doc:`Example: PyTorch - From Centralized To "
+"Federated `. The only thing "
+"to do is modifying the file called :code:`cifar.py`, revised part is shown "
+"below:"
msgstr ""
-"모든 파일은 :doc:`예제: 파이토치 - Centralized에서 Federated으로 `를 기반으로 수정합니다. :code:`cifar."
"py`라는 파일을 수정하기만 하면 되며, 수정된 부분은 아래와 같습니다:"
@@ -2394,8 +2454,9 @@ msgstr ""
msgid ""
"The model architecture defined in class Net() is added with Batch "
"Normalization layers accordingly."
-msgstr "Net() 클래스에 정의된 모델 아키텍처는 그에 따라 배치 정규화 레이어가 "
-"추가됩니다."
+msgstr ""
+"Net() 클래스에 정의된 모델 아키텍처는 그에 따라 배치 정규화 레이어가 추가됩니"
+"다."
#: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:41
#: ../../source/example-pytorch-from-centralized-to-federated.rst:157
@@ -2404,56 +2465,55 @@ msgstr "이제 머신 러닝 워크로드를 실행할 수 있습니다:"
#: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:47
msgid ""
-"So far this should all look fairly familiar if you've used PyTorch "
-"before. Let's take the next step and use what we've built to create a "
-"federated learning system within FedBN, the system consists of one server"
-" and two clients."
+"So far this should all look fairly familiar if you've used PyTorch before. "
+"Let's take the next step and use what we've built to create a federated "
+"learning system within FedBN, the system consists of one server and two "
+"clients."
msgstr ""
"지금까지는 파이토치를 사용해 본 적이 있다면 상당히 익숙하게 보일 것입니다. "
"다음 단계로 넘어가서 우리가 구축한 것을 사용하여 FedBN 내에서 하나의 서버와 "
-"두 개의 클라이언트로 구성된 federated 학습 시스템을 만들어 보겠습니다."
+"두 개의 클라이언트로 구성된 연합학습 시스템을 만들어 보겠습니다."
#: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:51
#: ../../source/example-pytorch-from-centralized-to-federated.rst:167
msgid "Federated Training"
-msgstr "Federated 훈련"
+msgstr "연합 훈련"
#: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:53
msgid ""
"If you have read :doc:`Example: PyTorch - From Centralized To Federated "
-"`, the following parts are"
-" easy to follow, only :code:`get_parameters` and :code:`set_parameters` "
-"function in :code:`client.py` needed to revise. If not, please read the "
-":doc:`Example: PyTorch - From Centralized To Federated `. first."
+"`, the following parts are "
+"easy to follow, only :code:`get_parameters` and :code:`set_parameters` "
+"function in :code:`client.py` needed to revise. If not, please read the :doc:"
+"`Example: PyTorch - From Centralized To Federated `. first."
msgstr ""
-":doc:`예제: 파이토치 - Centralized에서 Federated으로 `를 읽었다면, 다음 부분은 쉽게 따라할 수 있으며 "
":code:`client.py`의 :code:`get_parameters`와 :code:`set_parameters` 함수만 "
-"수정해야 합니다. 그렇지 않은 경우 :doc:`예제: 파이토치 - Centralized에서 "
-"Federated으로 `를 먼저 "
+"수정해야 합니다. 그렇지 않은 경우 :doc:`예제: 파이토치 - 중앙 집중식에서 "
+"연합식으로 `를 먼저 "
"읽어보세요."
#: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:56
msgid ""
-"Our example consists of one *server* and two *clients*. In FedBN, "
-":code:`server.py` keeps unchanged, we can start the server directly."
+"Our example consists of one *server* and two *clients*. In FedBN, :code:"
+"`server.py` keeps unchanged, we can start the server directly."
msgstr ""
-"이 예제는 하나의 *서버*와 두 개의 *클라이언트*로 구성됩니다. FedBN에서 "
-":code:`server.py`는 변경되지 않고 그대로 유지되므로 서버를 바로 시작할 수 "
-"있습니다."
+"이 예제는 하나의 *서버*와 두 개의 *클라이언트*로 구성됩니다. FedBN에서 :code:"
+"`server.py`는 변경되지 않고 그대로 유지되므로 서버를 바로 시작할 수 있습니다."
#: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:62
msgid ""
-"Finally, we will revise our *client* logic by changing "
-":code:`get_parameters` and :code:`set_parameters` in :code:`client.py`, "
-"we will exclude batch normalization parameters from model parameter list "
-"when sending to or receiving from the server."
+"Finally, we will revise our *client* logic by changing :code:"
+"`get_parameters` and :code:`set_parameters` in :code:`client.py`, we will "
+"exclude batch normalization parameters from model parameter list when "
+"sending to or receiving from the server."
msgstr ""
-"마지막으로, :code:`client.py`에서 :code:`get_parameters` 및 "
-":code:`set_parameters`를 변경하여 *client* 로직을 수정할 것입니다. 서버로 "
-"보내거나 서버에서 받을 때 모델 파라미터 목록에서 배치 정규화 파라미터를 "
-"제외할 수 있습니다."
+"마지막으로, :code:`client.py`에서 :code:`get_parameters` 및 :code:"
+"`set_parameters`를 변경하여 *client* 로직을 수정할 것입니다. 서버로 보내거나 "
+"서버에서 받을 때 모델 파라미터 목록에서 배치 정규화 파라미터를 제외할 수 있습"
+"니다."
#: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:85
msgid "Now, you can now open two additional terminal windows and run"
@@ -2461,13 +2521,13 @@ msgstr "이제 두 개의 터미널 창을 추가로 열고 다음을 실행할
#: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:91
msgid ""
-"in each window (make sure that the server is still running before you do "
-"so) and see your (previously centralized) PyTorch project run federated "
-"learning with FedBN strategy across two clients. Congratulations!"
+"in each window (make sure that the server is still running before you do so) "
+"and see your (previously centralized) PyTorch project run federated learning "
+"with FedBN strategy across two clients. Congratulations!"
msgstr ""
-"를 입력하고(클릭하기 전에 서버가 계속 실행 중인지 확인하세요), (이전에 "
-"centralized된) PyTorch 프로젝트가 두 클라이언트에서 FedBN으로 federated "
-"학습을 실행하는 것을 확인합니다. 축하합니다!"
+"를 입력하고(클릭하기 전에 서버가 계속 실행 중인지 확인하세요), (이전에 중앙 "
+"집중된) PyTorch 프로젝트가 두 클라이언트에서 FedBN으로 연합 학습을 실행하는 "
+"것을 확인합니다. 축하합니다!"
#: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:94
#: ../../source/example-jax-from-centralized-to-federated.rst:277
@@ -2478,20 +2538,19 @@ msgstr "다음 단계"
#: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:96
msgid ""
-"The full source code for this example can be found `here "
-"`_. Our example is of course somewhat over-"
-"simplified because both clients load the exact same dataset, which isn't "
-"realistic. You're now prepared to explore this topic further. How about "
-"using different subsets of CIFAR-10 on each client? How about adding more"
-" clients?"
+"The full source code for this example can be found `here `_. Our "
+"example is of course somewhat over-simplified because both clients load the "
+"exact same dataset, which isn't realistic. You're now prepared to explore "
+"this topic further. How about using different subsets of CIFAR-10 on each "
+"client? How about adding more clients?"
msgstr ""
"이 예제의 전체 소스 코드는 '여기 `_'에서 확인할 수 있습니다. "
-"물론 이 예제는 두 클라이언트가 완전히 동일한 데이터 세트를 로드하기 때문에 "
-"다소 지나치게 단순화되어 있으며, 이는 현실적이지 않습니다. 이제 이 주제를 더 "
-"자세히 살펴볼 준비가 되셨습니다. 각 클라이언트에서 서로 다른 CIFAR-10의 하위 "
-"집합을 사용해 보는 것은 어떨까요? 클라이언트를 더 추가하는 것은 어떨까요?"
+"examples/pytorch-from-centralized-to-federated>`_'에서 확인할 수 있습니다. 물"
+"론 이 예제는 두 클라이언트가 완전히 동일한 데이터 세트를 로드하기 때문에 다"
+"소 지나치게 단순화되어 있으며, 이는 현실적이지 않습니다. 이제 이 주제를 더 자"
+"세히 살펴볼 준비가 되셨습니다. 각 클라이언트에서 서로 다른 CIFAR-10의 하위 집"
+"합을 사용해 보는 것은 어떨까요? 클라이언트를 더 추가하는 것은 어떨까요?"
#: ../../source/example-jax-from-centralized-to-federated.rst:2
msgid "Example: JAX - Run JAX Federated"
@@ -2500,32 +2559,31 @@ msgstr "예시: JAX - JAX Federated 실행"
#: ../../source/example-jax-from-centralized-to-federated.rst:4
#: ../../source/tutorial-quickstart-jax.rst:10
msgid ""
-"This tutorial will show you how to use Flower to build a federated "
-"version of an existing JAX workload. We are using JAX to train a linear "
-"regression model on a scikit-learn dataset. We will structure the example"
-" similar to our `PyTorch - From Centralized To Federated "
-"`_ walkthrough. First, we build a centralized "
-"training approach based on the `Linear Regression with JAX "
-"`_"
-" tutorial`. Then, we build upon the centralized training code to run the "
-"training in a federated fashion."
-msgstr ""
-"이 튜토리얼에서는 Flower를 사용하여 기존 JAX 워크로드의 federated 버전을 "
-"구축하는 방법을 보여드립니다. JAX를 사용해 scikit-learn 데이터 세트에서 선형 "
-"회귀 모델을 훈련하고 있습니다. 예제는 '파이토치 - Centralized에서 "
-"Federated으로 `_ 워크스루와 유사하게 구성하겠습니다. 먼저, `"
-"JAX를 사용한 선형 회귀 `_ 튜토리얼`을 기반으로 centralized 학습 접근 "
-"방식을 구축합니다. 그런 다음 centralized 트레이닝 코드를 기반으로 federated "
-"방식으로 트레이닝을 실행합니다."
+"This tutorial will show you how to use Flower to build a federated version "
+"of an existing JAX workload. We are using JAX to train a linear regression "
+"model on a scikit-learn dataset. We will structure the example similar to "
+"our `PyTorch - From Centralized To Federated `_ walkthrough. "
+"First, we build a centralized training approach based on the `Linear "
+"Regression with JAX `_ tutorial`. Then, we build upon the centralized "
+"training code to run the training in a federated fashion."
+msgstr ""
+"이 튜토리얼에서는 Flower를 사용하여 기존 JAX 워크로드의 연합 버전을 구축하는 "
+"방법을 보여드립니다. JAX를 사용해 scikit-learn 데이터 세트에서 선형 회귀 "
+"모델을 훈련하고 있습니다. 예제는 '파이토치 - Centralized에서 Federated으로 "
+"`_ 워크스루와 유사하게 구성하겠습니다. 먼저, `JAX를 사용한 선형 "
+"회귀 `_ 튜토리얼`을 기반으로 centralized 학습 접근 방식을 구축합니다. 그런 "
+"다음 centralized 트레이닝 코드를 기반으로 federated 방식으로 트레이닝을 "
+"실행합니다."
#: ../../source/example-jax-from-centralized-to-federated.rst:10
#: ../../source/tutorial-quickstart-jax.rst:16
msgid ""
-"Before we start building our JAX example, we need install the packages "
-":code:`jax`, :code:`jaxlib`, :code:`scikit-learn`, and :code:`flwr`:"
+"Before we start building our JAX example, we need install the packages :code:"
+"`jax`, :code:`jaxlib`, :code:`scikit-learn`, and :code:`flwr`:"
msgstr ""
"JAX 예제 빌드를 시작하기 전에 :code:`jax`, :code:`jaxlib`, :code:`scikit-"
"learn`, :code:`flwr` 패키지를 설치해야 합니다:"
@@ -2538,12 +2596,12 @@ msgstr "JAX를 사용한 선형 회귀"
#: ../../source/example-jax-from-centralized-to-federated.rst:20
#: ../../source/tutorial-quickstart-jax.rst:26
msgid ""
-"We begin with a brief description of the centralized training code based "
-"on a :code:`Linear Regression` model. If you want a more in-depth "
-"explanation of what's going on then have a look at the official `JAX "
-"documentation `_."
+"We begin with a brief description of the centralized training code based on "
+"a :code:`Linear Regression` model. If you want a more in-depth explanation "
+"of what's going on then have a look at the official `JAX documentation "
+"`_."
msgstr ""
-"먼저 :code:`선형 회귀` 모델을 기반으로 하는 centralized 훈련 코드에 대한 "
+"먼저 :code:`선형 회귀` 모델을 기반으로 하는 중앙 집중식 훈련 코드에 대한 "
"간략한 설명부터 시작하겠습니다. 더 자세한 설명을 원하시면 공식 `JAX 문서 "
"`_를 참조하세요."
@@ -2552,14 +2610,13 @@ msgstr ""
msgid ""
"Let's create a new file called :code:`jax_training.py` with all the "
"components required for a traditional (centralized) linear regression "
-"training. First, the JAX packages :code:`jax` and :code:`jaxlib` need to "
-"be imported. In addition, we need to import :code:`sklearn` since we use "
-":code:`make_regression` for the dataset and :code:`train_test_split` to "
-"split the dataset into a training and test set. You can see that we do "
-"not yet import the :code:`flwr` package for federated learning. This will"
-" be done later."
-msgstr ""
-"전통적인(centralized) 선형 회귀 훈련에 필요한 모든 구성 요소가 포함된 "
+"training. First, the JAX packages :code:`jax` and :code:`jaxlib` need to be "
+"imported. In addition, we need to import :code:`sklearn` since we use :code:"
+"`make_regression` for the dataset and :code:`train_test_split` to split the "
+"dataset into a training and test set. You can see that we do not yet import "
+"the :code:`flwr` package for federated learning. This will be done later."
+msgstr ""
+"전통적인(중앙 집중식) 선형 회귀 훈련에 필요한 모든 구성 요소가 포함된 "
":code:`jax_training.py`라는 새 파일을 생성해 보겠습니다. 먼저, JAX 패키지인 "
":code:`jax`와 :code:`jaxlib`를 가져와야 합니다. 또한 데이터 세트에 "
":code:`make_regression`을 사용하고 데이터 세트를 학습 및 테스트 세트로 "
@@ -2570,38 +2627,39 @@ msgstr ""
#: ../../source/example-jax-from-centralized-to-federated.rst:37
#: ../../source/tutorial-quickstart-jax.rst:43
msgid ""
-"The :code:`load_data()` function loads the mentioned training and test "
-"sets."
-msgstr "code:`load_data()` 함수는 앞서 언급한 트레이닝 및 테스트 세트를 로드합니다."
+"The :code:`load_data()` function loads the mentioned training and test sets."
+msgstr ""
+"code:`load_data()` 함수는 앞서 언급한 트레이닝 및 테스트 세트를 로드합니다."
#: ../../source/example-jax-from-centralized-to-federated.rst:47
#: ../../source/tutorial-quickstart-jax.rst:53
msgid ""
-"The model architecture (a very simple :code:`Linear Regression` model) is"
-" defined in :code:`load_model()`."
-msgstr "모델 아키텍처(매우 간단한 :code:`선형 회귀` 모델)는 :code:`load_model()`에 "
-"정의되어 있습니다."
+"The model architecture (a very simple :code:`Linear Regression` model) is "
+"defined in :code:`load_model()`."
+msgstr ""
+"모델 아키텍처(매우 간단한 :code:`선형 회귀` 모델)는 :code:`load_model()`에 정"
+"의되어 있습니다."
#: ../../source/example-jax-from-centralized-to-federated.rst:59
#: ../../source/tutorial-quickstart-jax.rst:65
msgid ""
-"We now need to define the training (function :code:`train()`), which "
-"loops over the training set and measures the loss (function "
-":code:`loss_fn()`) for each batch of training examples. The loss function"
-" is separate since JAX takes derivatives with a :code:`grad()` function "
-"(defined in the :code:`main()` function and called in :code:`train()`)."
+"We now need to define the training (function :code:`train()`), which loops "
+"over the training set and measures the loss (function :code:`loss_fn()`) for "
+"each batch of training examples. The loss function is separate since JAX "
+"takes derivatives with a :code:`grad()` function (defined in the :code:"
+"`main()` function and called in :code:`train()`)."
msgstr ""
-"이제 훈련 집합을 반복하고 각 훈련 예제 배치에 대해 손실을 측정하는(함수 "
-":code:`loss_fn()`) 훈련(함수 :code:`train()`)을 정의해야 합니다. JAX는 "
-":code:`grad()` 함수(:code:`main()` 함수에 정의되고 :code:`train()`에서 "
-"호출됨)로 파생물을 취하므로 손실 함수는 분리되어 있습니다."
+"이제 훈련 집합을 반복하고 각 훈련 예제 배치에 대해 손실을 측정하는(함수 :"
+"code:`loss_fn()`) 훈련(함수 :code:`train()`)을 정의해야 합니다. JAX는 :code:"
+"`grad()` 함수(:code:`main()` 함수에 정의되고 :code:`train()`에서 호출됨)로 파"
+"생물을 취하므로 손실 함수는 분리되어 있습니다."
#: ../../source/example-jax-from-centralized-to-federated.rst:77
#: ../../source/tutorial-quickstart-jax.rst:83
msgid ""
-"The evaluation of the model is defined in the function "
-":code:`evaluation()`. The function takes all test examples and measures "
-"the loss of the linear regression model."
+"The evaluation of the model is defined in the function :code:`evaluation()`. "
+"The function takes all test examples and measures the loss of the linear "
+"regression model."
msgstr ""
"모델의 평가는 :code:`evaluation()` 함수에 정의되어 있습니다. 이 함수는 모든 "
"테스트 예제를 가져와 선형 회귀 모델의 손실을 측정합니다."
@@ -2610,29 +2668,29 @@ msgstr ""
#: ../../source/tutorial-quickstart-jax.rst:94
msgid ""
"Having defined the data loading, model architecture, training, and "
-"evaluation we can put everything together and train our model using JAX. "
-"As already mentioned, the :code:`jax.grad()` function is defined in "
-":code:`main()` and passed to :code:`train()`."
+"evaluation we can put everything together and train our model using JAX. As "
+"already mentioned, the :code:`jax.grad()` function is defined in :code:"
+"`main()` and passed to :code:`train()`."
msgstr ""
-"데이터 로딩, 모델 아키텍처, 훈련 및 평가를 정의했으므로 이제 모든 것을 "
-"종합하여 JAX를 사용 모델을 훈련할 수 있습니다. 이미 언급했듯이 :code:`jax."
-"grad()` 함수는 :code:`main()`에 정의되어 :code:`train()`에 전달됩니다."
+"데이터 로딩, 모델 아키텍처, 훈련 및 평가를 정의했으므로 이제 모든 것을 종합하"
+"여 JAX를 사용 모델을 훈련할 수 있습니다. 이미 언급했듯이 :code:`jax.grad()` "
+"함수는 :code:`main()`에 정의되어 :code:`train()`에 전달됩니다."
#: ../../source/example-jax-from-centralized-to-federated.rst:105
#: ../../source/tutorial-quickstart-jax.rst:111
msgid "You can now run your (centralized) JAX linear regression workload:"
-msgstr "이제 (centralized) JAX 선형 회귀 워크로드를 실행할 수 있습니다:"
+msgstr "이제 (중앙 집중식) JAX 선형 회귀 워크로드를 실행할 수 있습니다:"
#: ../../source/example-jax-from-centralized-to-federated.rst:111
#: ../../source/tutorial-quickstart-jax.rst:117
msgid ""
-"So far this should all look fairly familiar if you've used JAX before. "
-"Let's take the next step and use what we've built to create a simple "
-"federated learning system consisting of one server and two clients."
+"So far this should all look fairly familiar if you've used JAX before. Let's "
+"take the next step and use what we've built to create a simple federated "
+"learning system consisting of one server and two clients."
msgstr ""
-"지금까지는 JAX를 사용해 본 적이 있다면 이 모든 것이 상당히 익숙해 보일 "
-"것입니다. 다음 단계로 넘어가서 우리가 구축한 것을 사용하여 하나의 서버와 두 "
-"개의 클라이언트로 구성된 간단한 연합 학습 시스템을 만들어 보겠습니다."
+"지금까지는 JAX를 사용해 본 적이 있다면 이 모든 것이 상당히 익숙해 보일 것입니"
+"다. 다음 단계로 넘어가서 우리가 구축한 것을 사용하여 하나의 서버와 두 개의 클"
+"라이언트로 구성된 간단한 연합 학습 시스템을 만들어 보겠습니다."
#: ../../source/example-jax-from-centralized-to-federated.rst:115
#: ../../source/tutorial-quickstart-jax.rst:121
@@ -2642,36 +2700,36 @@ msgstr "JAX와 Flower의 만남"
#: ../../source/example-jax-from-centralized-to-federated.rst:117
#: ../../source/tutorial-quickstart-jax.rst:123
msgid ""
-"The concept of federating an existing workload is always the same and "
-"easy to understand. We have to start a *server* and then use the code in "
-":code:`jax_training.py` for the *clients* that are connected to the "
-"*server*. The *server* sends model parameters to the clients. The "
-"*clients* run the training and update the parameters. The updated "
-"parameters are sent back to the *server*, which averages all received "
-"parameter updates. This describes one round of the federated learning "
-"process, and we repeat this for multiple rounds."
-msgstr ""
-"기존 워크로드를 federating하는 개념은 항상 동일하고 이해하기 쉽습니다. 서버*"
-"를 시작한 다음 *서버*에 연결된 *클라이언트*에 대해 :code:`jax_training.py`의 "
+"The concept of federating an existing workload is always the same and easy "
+"to understand. We have to start a *server* and then use the code in :code:"
+"`jax_training.py` for the *clients* that are connected to the *server*. The "
+"*server* sends model parameters to the clients. The *clients* run the "
+"training and update the parameters. The updated parameters are sent back to "
+"the *server*, which averages all received parameter updates. This describes "
+"one round of the federated learning process, and we repeat this for multiple "
+"rounds."
+msgstr ""
+"기존 워크로드를 연합하는 개념은 항상 동일하고 이해하기 쉽습니다. 서버*를 "
+"시작한 다음 *서버*에 연결된 *클라이언트*에 대해 :code:`jax_training.py`의 "
"코드를 사용해야 합니다. *서버*는 모델 파라미터를 클라이언트로 전송합니다. "
"클라이언트는 학습을 실행하고 파라미터를 업데이트합니다. 업데이트된 "
"파라미터는 *서버*로 다시 전송되며, 수신된 모든 파라미터 업데이트의 평균을 "
-"구합니다. 이는 federated 학습 프로세스의 한 라운드를 설명하며, 이 과정을 "
-"여러 라운드에 걸쳐 반복합니다."
+"구합니다. 이는 연합 학습 프로세스의 한 라운드를 설명하며, 이 과정을 여러 "
+"라운드에 걸쳐 반복합니다."
#: ../../source/example-jax-from-centralized-to-federated.rst:123
#: ../../source/example-pytorch-from-centralized-to-federated.rst:181
#: ../../source/tutorial-quickstart-jax.rst:129
msgid ""
-"Our example consists of one *server* and two *clients*. Let's set up "
-":code:`server.py` first. The *server* needs to import the Flower package "
-":code:`flwr`. Next, we use the :code:`start_server` function to start a "
-"server and tell it to perform three rounds of federated learning."
+"Our example consists of one *server* and two *clients*. Let's set up :code:"
+"`server.py` first. The *server* needs to import the Flower package :code:"
+"`flwr`. Next, we use the :code:`start_server` function to start a server and "
+"tell it to perform three rounds of federated learning."
msgstr ""
"이 예제는 하나의 *서버*와 두 개의 *클라이언트*로 구성됩니다. 먼저 "
":code:`server.py`를 설정해 보겠습니다. *server*는 Flower 패키지 :code:`flwr`"
"를 가져와야 합니다. 다음으로, :code:`start_server` 함수를 사용하여 서버를 "
-"시작하고 세 차례의 federated 학습을 수행하도록 지시합니다."
+"시작하고 세 차례의 연합 학습을 수행하도록 지시합니다."
#: ../../source/example-jax-from-centralized-to-federated.rst:133
#: ../../source/example-pytorch-from-centralized-to-federated.rst:191
@@ -2682,39 +2740,38 @@ msgstr "이미 *서버*를 시작할 수 있습니다:"
#: ../../source/example-jax-from-centralized-to-federated.rst:139
#: ../../source/tutorial-quickstart-jax.rst:145
msgid ""
-"Finally, we will define our *client* logic in :code:`client.py` and build"
-" upon the previously defined JAX training in :code:`jax_training.py`. Our"
-" *client* needs to import :code:`flwr`, but also :code:`jax` and "
-":code:`jaxlib` to update the parameters on our JAX model:"
+"Finally, we will define our *client* logic in :code:`client.py` and build "
+"upon the previously defined JAX training in :code:`jax_training.py`. Our "
+"*client* needs to import :code:`flwr`, but also :code:`jax` and :code:"
+"`jaxlib` to update the parameters on our JAX model:"
msgstr ""
-"마지막으로, :code:`client.py`에서 *client* 로직을 정의하고 "
-":code:`jax_training.py`에서 이전에 정의한 JAX 교육을 기반으로 빌드합니다. "
-"*클라이언트*는 :code:`flwr`을 가져와야 하며, JAX 모델의 파라미터를 "
-"업데이트하기 위해 :code:`jax` 및 :code:`jaxlib`도 가져와야 합니다:"
+"마지막으로, :code:`client.py`에서 *client* 로직을 정의하고 :code:"
+"`jax_training.py`에서 이전에 정의한 JAX 교육을 기반으로 빌드합니다. *클라이언"
+"트*는 :code:`flwr`을 가져와야 하며, JAX 모델의 파라미터를 업데이트하기 위해 :"
+"code:`jax` 및 :code:`jaxlib`도 가져와야 합니다:"
#: ../../source/example-jax-from-centralized-to-federated.rst:154
#: ../../source/tutorial-quickstart-jax.rst:160
msgid ""
-"Implementing a Flower *client* basically means implementing a subclass of"
-" either :code:`flwr.client.Client` or :code:`flwr.client.NumPyClient`. "
-"Our implementation will be based on :code:`flwr.client.NumPyClient` and "
-"we'll call it :code:`FlowerClient`. :code:`NumPyClient` is slightly "
-"easier to implement than :code:`Client` if you use a framework with good "
-"NumPy interoperability (like JAX) because it avoids some of the "
-"boilerplate that would otherwise be necessary. :code:`FlowerClient` needs"
-" to implement four methods, two methods for getting/setting model "
-"parameters, one method for training the model, and one method for testing"
-" the model:"
+"Implementing a Flower *client* basically means implementing a subclass of "
+"either :code:`flwr.client.Client` or :code:`flwr.client.NumPyClient`. Our "
+"implementation will be based on :code:`flwr.client.NumPyClient` and we'll "
+"call it :code:`FlowerClient`. :code:`NumPyClient` is slightly easier to "
+"implement than :code:`Client` if you use a framework with good NumPy "
+"interoperability (like JAX) because it avoids some of the boilerplate that "
+"would otherwise be necessary. :code:`FlowerClient` needs to implement four "
+"methods, two methods for getting/setting model parameters, one method for "
+"training the model, and one method for testing the model:"
msgstr ""
"Flower *클라이언트*를 구현한다는 것은 기본적으로 :code:`flwr.client.Client` "
-"또는 :code:`flwr.client.NumPyClient`의 서브클래스를 구현하는 것을 "
-"의미합니다. 구현은 :code:`flwr.client.NumPyClient`를 기반으로 하며, 이를 "
-":code:`FlowerClient`라고 부를 것입니다. :code:`NumPyClient`는 필요한 일부 "
-"보일러플레이를 피할 수 있기 때문에 NumPy 상호 운용성이 좋은 프레임워크(예: "
-"JAX)를 사용하는 경우 :code:`Client`보다 구현하기가 약간 더 쉽습니다. "
-"code:`FlowerClient`는 모델 매개변수를 가져오거나 설정하는 메서드 2개, 모델 "
-"학습을 위한 메서드 1개, 모델 테스트를 위한 메서드 1개 등 총 4개의 메서드를 "
-"구현해야 합니다:"
+"또는 :code:`flwr.client.NumPyClient`의 서브클래스를 구현하는 것을 의미합니"
+"다. 구현은 :code:`flwr.client.NumPyClient`를 기반으로 하며, 이를 :code:"
+"`FlowerClient`라고 부를 것입니다. :code:`NumPyClient`는 필요한 일부 보일러플"
+"레이를 피할 수 있기 때문에 NumPy 상호 운용성이 좋은 프레임워크(예: JAX)를 사"
+"용하는 경우 :code:`Client`보다 구현하기가 약간 더 쉽습니다. code:"
+"`FlowerClient`는 모델 매개변수를 가져오거나 설정하는 메서드 2개, 모델 학습을 "
+"위한 메서드 1개, 모델 테스트를 위한 메서드 1개 등 총 4개의 메서드를 구현해야 "
+"합니다:"
#: ../../source/example-jax-from-centralized-to-federated.rst:161
#: ../../source/tutorial-quickstart-jax.rst:167
@@ -2725,8 +2782,7 @@ msgstr ":code:`set_parameters (선택사항)`"
#: ../../source/example-pytorch-from-centralized-to-federated.rst:219
#: ../../source/tutorial-quickstart-jax.rst:166
msgid ""
-"set the model parameters on the local model that are received from the "
-"server"
+"set the model parameters on the local model that are received from the server"
msgstr "서버에서 수신한 로컬 모델의 모델 파라미터를 설정합니다"
#: ../../source/example-jax-from-centralized-to-federated.rst:161
@@ -2738,10 +2794,11 @@ msgstr "매개 변수를 NumPy :code:`ndarray`로 변환"
#: ../../source/example-pytorch-from-centralized-to-federated.rst:220
#: ../../source/tutorial-quickstart-jax.rst:168
msgid ""
-"loop over the list of model parameters received as NumPy "
-":code:`ndarray`'s (think list of neural network layers)"
-msgstr "(신경망 레이어 목록으로 생각하면 됩니다) NumPy :code:`ndarray`로 받은 모델 "
-"파라미터 목록에 대해 반복합니다"
+"loop over the list of model parameters received as NumPy :code:`ndarray`'s "
+"(think list of neural network layers)"
+msgstr ""
+"(신경망 레이어 목록으로 생각하면 됩니다) NumPy :code:`ndarray`로 받은 모델 파"
+"라미터 목록에 대해 반복합니다"
#: ../../source/example-jax-from-centralized-to-federated.rst:163
#: ../../source/example-pytorch-from-centralized-to-federated.rst:221
@@ -2755,11 +2812,11 @@ msgstr ":code:`get_parameters`"
#: ../../source/example-pytorch-from-centralized-to-federated.rst:222
#: ../../source/tutorial-quickstart-jax.rst:170
msgid ""
-"get the model parameters and return them as a list of NumPy "
-":code:`ndarray`'s (which is what :code:`flwr.client.NumPyClient` expects)"
+"get the model parameters and return them as a list of NumPy :code:"
+"`ndarray`'s (which is what :code:`flwr.client.NumPyClient` expects)"
msgstr ""
-"모델 매개변수를 가져와서 NumPy :code:`ndarray`의 목록으로 반환합니다(이는 "
-":code:`flwr.client.NumPyClient`가 기대하는 바와 같습니다)"
+"모델 매개변수를 가져와서 NumPy :code:`ndarray`의 목록으로 반환합니다(이는 :"
+"code:`flwr.client.NumPyClient`가 기대하는 바와 같습니다)"
#: ../../source/example-jax-from-centralized-to-federated.rst:167
#: ../../source/example-pytorch-from-centralized-to-federated.rst:225
@@ -2776,8 +2833,8 @@ msgstr ":code:`fit`"
#: ../../source/tutorial-quickstart-jax.rst:172
#: ../../source/tutorial-quickstart-jax.rst:176
msgid ""
-"update the parameters of the local model with the parameters received "
-"from the server"
+"update the parameters of the local model with the parameters received from "
+"the server"
msgstr "서버에서 받은 파라미터로 로컬 모델의 파라미터를 업데이트합니다"
#: ../../source/example-jax-from-centralized-to-federated.rst:167
@@ -2813,9 +2870,9 @@ msgstr "로컬 손실을 서버로 반환합니다"
#: ../../source/example-jax-from-centralized-to-federated.rst:174
#: ../../source/tutorial-quickstart-jax.rst:180
msgid ""
-"The challenging part is to transform the JAX model parameters from "
-":code:`DeviceArray` to :code:`NumPy ndarray` to make them compatible with"
-" `NumPyClient`."
+"The challenging part is to transform the JAX model parameters from :code:"
+"`DeviceArray` to :code:`NumPy ndarray` to make them compatible with "
+"`NumPyClient`."
msgstr ""
"어려운 부분은 JAX 모델 매개변수를 :code:`DeviceArray`에서 :code:`NumPy "
"ndarray`로 변환하여 `NumPyClient`와 호환되도록 하는 것입니다."
@@ -2823,97 +2880,96 @@ msgstr ""
#: ../../source/example-jax-from-centralized-to-federated.rst:176
#: ../../source/tutorial-quickstart-jax.rst:182
msgid ""
-"The two :code:`NumPyClient` methods :code:`fit` and :code:`evaluate` make"
-" use of the functions :code:`train()` and :code:`evaluate()` previously "
+"The two :code:`NumPyClient` methods :code:`fit` and :code:`evaluate` make "
+"use of the functions :code:`train()` and :code:`evaluate()` previously "
"defined in :code:`jax_training.py`. So what we really do here is we tell "
-"Flower through our :code:`NumPyClient` subclass which of our already "
-"defined functions to call for training and evaluation. We included type "
-"annotations to give you a better understanding of the data types that get"
-" passed around."
-msgstr ""
-"두 개의 :code:`NumPyClient` 메서드인 :code:`fit`과 :code:`evaluate`는 이전에 "
-":code:`jax_training.py`에 정의된 함수 :code:`train()`과 :code:`evaluate()`를 "
-"사용합니다. 따라서 여기서 우리가 실제로 하는 일은 이미 정의된 함수 중 훈련과 "
-"평가를 위해 호출할 함수를 :code:`NumPyClient` 서브클래스를 통해 Flower에게 "
-"알려주는 것입니다. 전달되는 데이터 유형을 더 잘 이해할 수 있도록 유형 type "
-"annotation을 포함했습니다."
+"Flower through our :code:`NumPyClient` subclass which of our already defined "
+"functions to call for training and evaluation. We included type annotations "
+"to give you a better understanding of the data types that get passed around."
+msgstr ""
+"두 개의 :code:`NumPyClient` 메서드인 :code:`fit`과 :code:`evaluate`는 이전"
+"에 :code:`jax_training.py`에 정의된 함수 :code:`train()`과 :code:`evaluate()`"
+"를 사용합니다. 따라서 여기서 우리가 실제로 하는 일은 이미 정의된 함수 중 훈련"
+"과 평가를 위해 호출할 함수를 :code:`NumPyClient` 서브클래스를 통해 Flower에"
+"게 알려주는 것입니다. 전달되는 데이터 유형을 더 잘 이해할 수 있도록 유형 "
+"type annotation을 포함했습니다."
#: ../../source/example-jax-from-centralized-to-federated.rst:245
#: ../../source/tutorial-quickstart-jax.rst:251
msgid "Having defined the federation process, we can run it."
-msgstr "federation 프로세스를 정의했으면 이제 실행할 수 있습니다."
+msgstr "연합 프로세스를 정의했으면 이제 실행할 수 있습니다."
#: ../../source/example-jax-from-centralized-to-federated.rst:268
#: ../../source/example-pytorch-from-centralized-to-federated.rst:301
#: ../../source/tutorial-quickstart-jax.rst:274
msgid "And that's it. You can now open two additional terminal windows and run"
-msgstr ""
+msgstr "여기까지입니다. 이제 두 개의 터미널 창을 추가로 열고 다음을 실행할 수 "
+"있습니다"
#: ../../source/example-jax-from-centralized-to-federated.rst:274
#: ../../source/tutorial-quickstart-jax.rst:280
msgid ""
-"in each window (make sure that the server is still running before you do "
-"so) and see your JAX project run federated learning across two clients. "
+"in each window (make sure that the server is still running before you do so) "
+"and see your JAX project run federated learning across two clients. "
"Congratulations!"
msgstr ""
"를 입력하고(그 전에 서버가 계속 실행 중인지 확인하세요) 두 클라이언트에서 "
-"federated 학습을 실행하는 JAX 프로젝트를 확인합니다. 축하합니다!"
+"연합 학습을 실행하는 JAX 프로젝트를 확인합니다. 축하합니다!"
#: ../../source/example-jax-from-centralized-to-federated.rst:279
#: ../../source/tutorial-quickstart-jax.rst:285
msgid ""
"The source code of this example was improved over time and can be found "
-"here: `Quickstart JAX `_. Our example is somewhat over-simplified because both "
+"here: `Quickstart JAX `_. Our example is somewhat over-simplified because both "
"clients load the same dataset."
msgstr ""
-"이 예제의 소스 코드는 시간이 지남에 따라 개선되었으며 여기에서 확인할 수 "
-"있습니다: 'Quickstart JAX `_. 두 클라이언트가 동일한 데이터 세트를 로드하기 때문에 이 "
-"예제는 다소 단순화되어 있습니다."
+"이 예제의 소스 코드는 시간이 지남에 따라 개선되었으며 여기에서 확인할 수 있습"
+"니다: 'Quickstart JAX `_. 두 클라이언트가 동일한 데이터 세트를 로드하기 때문에 이 예"
+"제는 다소 단순화되어 있습니다."
#: ../../source/example-jax-from-centralized-to-federated.rst:282
#: ../../source/tutorial-quickstart-jax.rst:288
msgid ""
-"You're now prepared to explore this topic further. How about using a more"
-" sophisticated model or using a different dataset? How about adding more "
+"You're now prepared to explore this topic further. How about using a more "
+"sophisticated model or using a different dataset? How about adding more "
"clients?"
msgstr ""
-"이제 이 주제를 더 자세히 살펴볼 준비가 되었습니다. 더 정교한 모델을 "
-"사용하거나 다른 데이터 집합을 사용해 보는 것은 어떨까요? 클라이언트를 더 "
-"추가하는 것은 어떨까요?"
+"이제 이 주제를 더 자세히 살펴볼 준비가 되었습니다. 더 정교한 모델을 사용하거"
+"나 다른 데이터 집합을 사용해 보는 것은 어떨까요? 클라이언트를 더 추가하는 것"
+"은 어떨까요?"
#: ../../source/example-pytorch-from-centralized-to-federated.rst:2
msgid "Example: PyTorch - From Centralized To Federated"
-msgstr "예제: 파이토치 - 중앙 Centralized에서 Federated으로"
+msgstr "예제: 파이토치 - 중앙 집중식에서 연합식으로"
#: ../../source/example-pytorch-from-centralized-to-federated.rst:4
msgid ""
-"This tutorial will show you how to use Flower to build a federated "
-"version of an existing machine learning workload. We are using PyTorch to"
-" train a Convolutional Neural Network on the CIFAR-10 dataset. First, we "
-"introduce this machine learning task with a centralized training approach"
-" based on the `Deep Learning with PyTorch "
-"`_ "
-"tutorial. Then, we build upon the centralized training code to run the "
-"training in a federated fashion."
+"This tutorial will show you how to use Flower to build a federated version "
+"of an existing machine learning workload. We are using PyTorch to train a "
+"Convolutional Neural Network on the CIFAR-10 dataset. First, we introduce "
+"this machine learning task with a centralized training approach based on the "
+"`Deep Learning with PyTorch `_ tutorial. Then, we build upon the centralized "
+"training code to run the training in a federated fashion."
msgstr ""
-"이 튜토리얼에서는 Flower를 사용해 기존 머신 러닝 워크로드의 federated 버전을 "
+"이 튜토리얼에서는 Flower를 사용해 기존 머신 러닝 워크로드의 연합 버전을 "
"구축하는 방법을 보여드립니다. 여기서는 PyTorch를 사용해 CIFAR-10 데이터 "
"세트에서 컨볼루션 신경망을 훈련합니다. 먼저, 'PyTorch로 딥 러닝 "
"`_ "
"튜토리얼을 기반으로 centralized 학습 접근 방식을 사용하여 이 머신 러닝 "
-"작업을 소개합니다. 그런 다음 centralized 훈련 코드를 기반으로 federated 방식 "
+"작업을 소개합니다. 그런 다음 centralized 훈련 코드를 기반으로 연합 방식 "
"훈련을 실행합니다."
#: ../../source/example-pytorch-from-centralized-to-federated.rst:12
msgid ""
-"We begin with a brief description of the centralized CNN training code. "
-"If you want a more in-depth explanation of what's going on then have a "
-"look at the official `PyTorch tutorial "
-"`_."
+"We begin with a brief description of the centralized CNN training code. If "
+"you want a more in-depth explanation of what's going on then have a look at "
+"the official `PyTorch tutorial `_."
msgstr ""
-"centralized CNN 트레이닝 코드에 대한 간략한 설명부터 시작하겠습니다. 무슨 "
+"중앙 집중식 CNN 트레이닝 코드에 대한 간략한 설명부터 시작하겠습니다. 무슨 "
"일이 일어나고 있는지 더 자세히 설명하려면 공식 `PyTorch 튜토리얼 "
"`_을 "
"참조하세요."
@@ -2921,18 +2977,17 @@ msgstr ""
#: ../../source/example-pytorch-from-centralized-to-federated.rst:15
msgid ""
"Let's create a new file called :code:`cifar.py` with all the components "
-"required for a traditional (centralized) training on CIFAR-10. First, all"
-" required packages (such as :code:`torch` and :code:`torchvision`) need "
-"to be imported. You can see that we do not import any package for "
-"federated learning. You can keep all these imports as they are even when "
-"we add the federated learning components at a later point."
+"required for a traditional (centralized) training on CIFAR-10. First, all "
+"required packages (such as :code:`torch` and :code:`torchvision`) need to be "
+"imported. You can see that we do not import any package for federated "
+"learning. You can keep all these imports as they are even when we add the "
+"federated learning components at a later point."
msgstr ""
-"CIFAR-10에 대한 기존 (centralized) 교육에 필요한 모든 구성 요소가 포함된 "
+"CIFAR-10에 대한 기존 (중앙 집중식) 교육에 필요한 모든 구성 요소가 포함된 "
":code:`cifar.py`라는 새 파일을 생성해 보겠습니다. 먼저, 필요한 모든 "
-"패키지(예: :code:`torch` 및 :code:`torchvision`)를 가져와야 합니다. "
-"federated 학습을 위한 패키지를 가져오지 않는 것을 확인 할 수 있습니. 나중에 "
-"federated 학습 구성 요소를 추가할 때에도 이러한 모든 가져오기를 그대로 "
-"유지할 수 있습니다."
+"패키지(예: :code:`torch` 및 :code:`torchvision`)를 가져와야 합니다. 연합 "
+"학습을 위한 패키지를 가져오지 않는 것을 확인 할 수 있습니. 나중에 연합 학습 "
+"구성 요소를 추가할 때에도 이러한 모든 가져오기를 그대로 유지할 수 있습니다."
#: ../../source/example-pytorch-from-centralized-to-federated.rst:32
msgid ""
@@ -2946,124 +3001,125 @@ msgstr ""
#: ../../source/example-pytorch-from-centralized-to-federated.rst:56
msgid ""
-"The :code:`load_data()` function loads the CIFAR-10 training and test "
-"sets. The :code:`transform` normalized the data after loading."
+"The :code:`load_data()` function loads the CIFAR-10 training and test sets. "
+"The :code:`transform` normalized the data after loading."
msgstr ""
-":code:`load_data()` 함수는 CIFAR-10 훈련 및 테스트 세트를 로드합니다. "
-":code:`transform`은 로드 후 데이터를 정규화합니다."
+":code:`load_data()` 함수는 CIFAR-10 훈련 및 테스트 세트를 로드합니다. :code:"
+"`transform`은 로드 후 데이터를 정규화합니다."
#: ../../source/example-pytorch-from-centralized-to-federated.rst:74
msgid ""
-"We now need to define the training (function :code:`train()`) which loops"
-" over the training set, measures the loss, backpropagates it, and then "
-"takes one optimizer step for each batch of training examples."
+"We now need to define the training (function :code:`train()`) which loops "
+"over the training set, measures the loss, backpropagates it, and then takes "
+"one optimizer step for each batch of training examples."
msgstr ""
"이제 학습 집합을 반복하고, 손실을 측정하고, 이를 역전파한 다음 각 학습 예제 "
-"배치에 대해 하나의 최적화 단계를 수행하는 학습(함수 :code:`train()`)을 "
-"정의해야 합니다."
+"배치에 대해 하나의 최적화 단계를 수행하는 학습(함수 :code:`train()`)을 정의해"
+"야 합니다."
#: ../../source/example-pytorch-from-centralized-to-federated.rst:76
msgid ""
-"The evaluation of the model is defined in the function :code:`test()`. "
-"The function loops over all test samples and measures the loss of the "
-"model based on the test dataset."
+"The evaluation of the model is defined in the function :code:`test()`. The "
+"function loops over all test samples and measures the loss of the model "
+"based on the test dataset."
msgstr ""
-"모델 평가는 :code:`test()` 함수에 정의되어 있습니다. 이 함수는 모든 테스트 "
-"샘플을 반복하고 테스트 데이터 세트에 따라 모델의 손실을 측정합니다."
+"모델 평가는 :code:`test()` 함수에 정의되어 있습니다. 이 함수는 모든 테스트 샘"
+"플을 반복하고 테스트 데이터 세트에 따라 모델의 손실을 측정합니다."
#: ../../source/example-pytorch-from-centralized-to-federated.rst:136
msgid ""
"Having defined the data loading, model architecture, training, and "
"evaluation we can put everything together and train our CNN on CIFAR-10."
-msgstr "데이터 로딩, 모델 아키텍처, 훈련 및 평가를 정의했으면 모든 것을 종합하여 "
+msgstr ""
+"데이터 로딩, 모델 아키텍처, 훈련 및 평가를 정의했으면 모든 것을 종합하여 "
"CIFAR-10에서 CNN을 훈련할 수 있습니다."
#: ../../source/example-pytorch-from-centralized-to-federated.rst:163
msgid ""
-"So far, this should all look fairly familiar if you've used PyTorch "
-"before. Let's take the next step and use what we've built to create a "
-"simple federated learning system consisting of one server and two "
-"clients."
+"So far, this should all look fairly familiar if you've used PyTorch before. "
+"Let's take the next step and use what we've built to create a simple "
+"federated learning system consisting of one server and two clients."
msgstr ""
-"지금까지는 파이토치를 사용해 본 적이 있다면 상당히 익숙하게 보일 것입니다. "
-"다음 단계로 넘어가서 구축한 것을 사용하여 하나의 서버와 두 개의 클라이언트로 "
-"구성된 간단한 연합 학습 시스템을 만들어 보겠습니다."
+"지금까지는 파이토치를 사용해 본 적이 있다면 상당히 익숙하게 보일 것입니다. 다"
+"음 단계로 넘어가서 구축한 것을 사용하여 하나의 서버와 두 개의 클라이언트로 구"
+"성된 간단한 연합 학습 시스템을 만들어 보겠습니다."
#: ../../source/example-pytorch-from-centralized-to-federated.rst:169
msgid ""
-"The simple machine learning project discussed in the previous section "
-"trains the model on a single dataset (CIFAR-10), we call this centralized"
-" learning. This concept of centralized learning, as shown in the previous"
-" section, is probably known to most of you, and many of you have used it "
-"previously. Normally, if you'd want to run machine learning workloads in "
-"a federated fashion, then you'd have to change most of your code and set "
-"everything up from scratch. This can be a considerable effort."
+"The simple machine learning project discussed in the previous section trains "
+"the model on a single dataset (CIFAR-10), we call this centralized learning. "
+"This concept of centralized learning, as shown in the previous section, is "
+"probably known to most of you, and many of you have used it previously. "
+"Normally, if you'd want to run machine learning workloads in a federated "
+"fashion, then you'd have to change most of your code and set everything up "
+"from scratch. This can be a considerable effort."
msgstr ""
"이전 섹션에서 설명한 간단한 머신 러닝 프로젝트는 단일 데이터 세트(CIFAR-10)"
-"로 모델을 학습시키는데, 이를 centralized 학습이라고 부릅니다. 이전 섹션에서 "
-"설명한 centralized 학습의 개념은 대부분 알고 계실 것이며, 많은 분들이 이전에 "
-"사용해 보셨을 것입니다. 일반적으로 머신 러닝 워크로드를 federated 방식으로 "
+"로 모델을 학습시키는데, 이를 중앙 집중식 학습이라고 부릅니다. 이전 섹션에서 "
+"설명한 중앙 집중식 학습의 개념은 대부분 알고 계실 것이며, 많은 분들이 이전에 "
+"사용해 보셨을 것입니다. 일반적으로 머신 러닝 워크로드를 연합 방식으로 "
"실행하려면 대부분의 코드를 변경하고 모든 것을 처음부터 다시 설정해야 합니다. "
"이는 상당한 노력이 필요할 수 있습니다."
#: ../../source/example-pytorch-from-centralized-to-federated.rst:173
msgid ""
-"However, with Flower you can evolve your pre-existing code into a "
-"federated learning setup without the need for a major rewrite."
-msgstr "하지만 Flower를 사용하면 대대적인 재작성 없이도 기존 코드를 연합 학습 "
-"설정으로 발전시킬 수 있습니다."
+"However, with Flower you can evolve your pre-existing code into a federated "
+"learning setup without the need for a major rewrite."
+msgstr ""
+"하지만 Flower를 사용하면 대대적인 재작성 없이도 기존 코드를 연합 학습 설정으"
+"로 발전시킬 수 있습니다."
#: ../../source/example-pytorch-from-centralized-to-federated.rst:175
msgid ""
-"The concept is easy to understand. We have to start a *server* and then "
-"use the code in :code:`cifar.py` for the *clients* that are connected to "
-"the *server*. The *server* sends model parameters to the clients. The "
-"*clients* run the training and update the parameters. The updated "
-"parameters are sent back to the *server* which averages all received "
-"parameter updates. This describes one round of the federated learning "
-"process and we repeat this for multiple rounds."
+"The concept is easy to understand. We have to start a *server* and then use "
+"the code in :code:`cifar.py` for the *clients* that are connected to the "
+"*server*. The *server* sends model parameters to the clients. The *clients* "
+"run the training and update the parameters. The updated parameters are sent "
+"back to the *server* which averages all received parameter updates. This "
+"describes one round of the federated learning process and we repeat this for "
+"multiple rounds."
msgstr ""
"개념은 이해하기 쉽습니다. *서버*를 시작한 다음 *서버*에 연결된 *클라이언트*"
"에 대해 :code:`cifar.py`의 코드를 사용해야 합니다. *서버*는 모델 파라미터를 "
"클라이언트로 전송합니다. *클라이언트*는 학습을 실행하고 파라미터를 "
"업데이트합니다. 업데이트된 파라미터는 *서버*로 다시 전송되며, *서버*는 "
-"수신된 모든 파라미터 업데이트의 평균을 구합니다. 이것은 federated 학습 "
-"프로세스의 한 라운드를 설명하며 여러 라운드에 걸쳐 이 과정을 반복합니다."
+"수신된 모든 파라미터 업데이트의 평균을 구합니다. 이것은 연합 학습 프로세스의 "
+"한 라운드를 설명하며 여러 라운드에 걸쳐 이 과정을 반복합니다."
#: ../../source/example-pytorch-from-centralized-to-federated.rst:197
msgid ""
-"Finally, we will define our *client* logic in :code:`client.py` and build"
-" upon the previously defined centralized training in :code:`cifar.py`. "
-"Our *client* needs to import :code:`flwr`, but also :code:`torch` to "
-"update the parameters on our PyTorch model:"
+"Finally, we will define our *client* logic in :code:`client.py` and build "
+"upon the previously defined centralized training in :code:`cifar.py`. Our "
+"*client* needs to import :code:`flwr`, but also :code:`torch` to update the "
+"parameters on our PyTorch model:"
msgstr ""
"마지막으로, :code:`client.py`에서 *client* 로직을 정의하고 :code:`cifar.py`"
-"에서 이전에 정의한 centralized 학습을 기반으로 구축합니다. *클라이언트*는 "
+"에서 이전에 정의한 중앙 집중식 학습을 기반으로 구축합니다. *클라이언트*는 "
":code:`flwr`을 가져와야 하며, PyTorch 모델의 파라미터를 업데이트하기 위해 "
":code:`torch`도 가져와야 합니다:"
#: ../../source/example-pytorch-from-centralized-to-federated.rst:213
msgid ""
-"Implementing a Flower *client* basically means implementing a subclass of"
-" either :code:`flwr.client.Client` or :code:`flwr.client.NumPyClient`. "
-"Our implementation will be based on :code:`flwr.client.NumPyClient` and "
-"we'll call it :code:`CifarClient`. :code:`NumPyClient` is slightly easier"
-" to implement than :code:`Client` if you use a framework with good NumPy "
-"interoperability (like PyTorch or TensorFlow/Keras) because it avoids "
-"some of the boilerplate that would otherwise be necessary. "
-":code:`CifarClient` needs to implement four methods, two methods for "
-"getting/setting model parameters, one method for training the model, and "
-"one method for testing the model:"
+"Implementing a Flower *client* basically means implementing a subclass of "
+"either :code:`flwr.client.Client` or :code:`flwr.client.NumPyClient`. Our "
+"implementation will be based on :code:`flwr.client.NumPyClient` and we'll "
+"call it :code:`CifarClient`. :code:`NumPyClient` is slightly easier to "
+"implement than :code:`Client` if you use a framework with good NumPy "
+"interoperability (like PyTorch or TensorFlow/Keras) because it avoids some "
+"of the boilerplate that would otherwise be necessary. :code:`CifarClient` "
+"needs to implement four methods, two methods for getting/setting model "
+"parameters, one method for training the model, and one method for testing "
+"the model:"
msgstr ""
"Flower *클라이언트*를 구현한다는 것은 기본적으로 :code:`flwr.client.Client` "
-"또는 :code:`flwr.client.NumPyClient`의 서브클래스를 구현하는 것을 "
-"의미합니다. 우리의 구현은 :code:`flwr.client.NumPyClient`를 기반으로 하며, "
-"이를 :code:`CifarClient`라고 부를 것입니다. :code:`NumPyClient`는 파이토치나 "
-"텐서플로우/Keras처럼 NumPy 상호운용성이 좋은 프레임워크를 사용하는 경우 "
-"필요한 일부 보일러플레이트를 피하기 때문에 :code:`Client`보다 구현하기가 "
-"조금 더 쉽습니다. code:`CifarClient`는 모델 파라미터를 가져오거나 설정하는 "
-"메서드 2개, 모델 학습을 위한 메서드 1개, 모델 테스트를 위한 메서드 1개 등 네 "
-"가지 메서드를 구현해야 합니다:"
+"또는 :code:`flwr.client.NumPyClient`의 서브클래스를 구현하는 것을 의미합니"
+"다. 우리의 구현은 :code:`flwr.client.NumPyClient`를 기반으로 하며, 이를 :"
+"code:`CifarClient`라고 부를 것입니다. :code:`NumPyClient`는 파이토치나 텐서플"
+"로우/Keras처럼 NumPy 상호운용성이 좋은 프레임워크를 사용하는 경우 필요한 일"
+"부 보일러플레이트를 피하기 때문에 :code:`Client`보다 구현하기가 조금 더 쉽습"
+"니다. code:`CifarClient`는 모델 파라미터를 가져오거나 설정하는 메서드 2개, 모"
+"델 학습을 위한 메서드 1개, 모델 테스트를 위한 메서드 1개 등 네 가지 메서드를 "
+"구현해야 합니다:"
#: ../../source/example-pytorch-from-centralized-to-federated.rst:219
msgid ":code:`set_parameters`"
@@ -3079,62 +3135,61 @@ msgstr "로컬 손실 및 정확도를 서버에 반환합니다"
#: ../../source/example-pytorch-from-centralized-to-federated.rst:232
msgid ""
-"The two :code:`NumPyClient` methods :code:`fit` and :code:`evaluate` make"
-" use of the functions :code:`train()` and :code:`test()` previously "
-"defined in :code:`cifar.py`. So what we really do here is we tell Flower "
-"through our :code:`NumPyClient` subclass which of our already defined "
-"functions to call for training and evaluation. We included type "
-"annotations to give you a better understanding of the data types that get"
-" passed around."
-msgstr ""
-"두 개의 :code:`NumPyClient` 메서드인 :code:`fit`과 :code:`evaluate`는 이전에 "
-":code:`cifar.py`에 정의된 함수인 :code:`train()`과 :code:`test()`를 "
-"활용합니다. 따라서 여기서 실제로 하는 일은 :code:`NumPyClient` 서브클래스를 "
-"통해 이미 정의된 함수 중 훈련과 평가를 위해 호출할 함수를 Flower에 알려주는 "
-"것입니다. 전달되는 데이터 유형을 더 잘 이해할 수 있도록 type annotations을 "
-"포함했습니다."
+"The two :code:`NumPyClient` methods :code:`fit` and :code:`evaluate` make "
+"use of the functions :code:`train()` and :code:`test()` previously defined "
+"in :code:`cifar.py`. So what we really do here is we tell Flower through "
+"our :code:`NumPyClient` subclass which of our already defined functions to "
+"call for training and evaluation. We included type annotations to give you a "
+"better understanding of the data types that get passed around."
+msgstr ""
+"두 개의 :code:`NumPyClient` 메서드인 :code:`fit`과 :code:`evaluate`는 이전"
+"에 :code:`cifar.py`에 정의된 함수인 :code:`train()`과 :code:`test()`를 활용합"
+"니다. 따라서 여기서 실제로 하는 일은 :code:`NumPyClient` 서브클래스를 통해 이"
+"미 정의된 함수 중 훈련과 평가를 위해 호출할 함수를 Flower에 알려주는 것입니"
+"다. 전달되는 데이터 유형을 더 잘 이해할 수 있도록 type annotations을 포함했습"
+"니다."
#: ../../source/example-pytorch-from-centralized-to-federated.rst:280
msgid ""
"All that's left to do it to define a function that loads both model and "
-"data, creates a :code:`CifarClient`, and starts this client. You load "
-"your data and model by using :code:`cifar.py`. Start :code:`CifarClient` "
-"with the function :code:`fl.client.start_client()` by pointing it at the "
-"same IP address we used in :code:`server.py`:"
+"data, creates a :code:`CifarClient`, and starts this client. You load your "
+"data and model by using :code:`cifar.py`. Start :code:`CifarClient` with the "
+"function :code:`fl.client.start_client()` by pointing it at the same IP "
+"address we used in :code:`server.py`:"
msgstr ""
-"이제 모델과 데이터를 모두 로드하는 함수를 정의하고, :code:`CifarClient`를 "
-"생성하고, 이 클라이언트를 시작하는 작업만 남았습니다. 코드:`cifar.py`를 "
-"사용하여 데이터와 모델을 로드합니다. :code:`server.py`에서 사용한 것과 "
-"동일한 IP 주소를 지정하여 :code:`fl.client.start_client()` 함수로 "
-":code:`CifarClient`를 시작합니다:"
+"이제 모델과 데이터를 모두 로드하는 함수를 정의하고, :code:`CifarClient`를 생"
+"성하고, 이 클라이언트를 시작하는 작업만 남았습니다. 코드:`cifar.py`를 사용하"
+"여 데이터와 모델을 로드합니다. :code:`server.py`에서 사용한 것과 동일한 IP 주"
+"소를 지정하여 :code:`fl.client.start_client()` 함수로 :code:`CifarClient`를 "
+"시작합니다:"
#: ../../source/example-pytorch-from-centralized-to-federated.rst:307
msgid ""
-"in each window (make sure that the server is running before you do so) "
-"and see your (previously centralized) PyTorch project run federated "
-"learning across two clients. Congratulations!"
+"in each window (make sure that the server is running before you do so) and "
+"see your (previously centralized) PyTorch project run federated learning "
+"across two clients. Congratulations!"
msgstr ""
-"를 입력하고(그 전에 서버가 실행 중인지 확인하세요) (이전에는centralized) "
-"PyTorch 프로젝트가 두 클라이언트에서 federated 학습을 실행하는 것을 "
-"확인합니다. 축하합니다!"
+"를 입력하고(그 전에 서버가 실행 중인지 확인하세요) (이전에는 중앙 집중식) "
+"PyTorch 프로젝트가 두 클라이언트에서 연합 학습을 실행하는 것을 확인합니다. "
+"축하합니다!"
#: ../../source/example-pytorch-from-centralized-to-federated.rst:312
msgid ""
"The full source code for this example: `PyTorch: From Centralized To "
-"Federated (Code) `_. Our example is, of course, "
-"somewhat over-simplified because both clients load the exact same "
-"dataset, which isn't realistic. You're now prepared to explore this topic"
-" further. How about using different subsets of CIFAR-10 on each client? "
-"How about adding more clients?"
-msgstr ""
-"이 예제의 전체 소스 코드: `파이토치: 중앙 Centralized에서 Federated으로 "
-"(코드) `_. 물론 이 예제는 두 클라이언트가 완전히 동일한 "
-"데이터 세트를 로드하기 때문에 다소 지나치게 단순화되어 있으며, 이는 "
-"현실적이지 않습니다. 이제 이 주제를 더 자세히 살펴볼 준비가 되셨습니다. 각 "
-"클라이언트에서 서로 다른 CIFAR-10의 하위 집합을 사용해 보는 것은 어떨까요? "
-"클라이언트를 더 추가하는 것은 어떨까요?"
+"Federated (Code) `_. Our example is, of course, somewhat over-"
+"simplified because both clients load the exact same dataset, which isn't "
+"realistic. You're now prepared to explore this topic further. How about "
+"using different subsets of CIFAR-10 on each client? How about adding more "
+"clients?"
+msgstr ""
+"이 예제의 전체 소스 코드: `파이토치: 중앙 Centralized에서 Federated으로 (코"
+"드) `_. 물론 이 예제는 두 클라이언트가 완전히 동일한 데"
+"이터 세트를 로드하기 때문에 다소 지나치게 단순화되어 있으며, 이는 현실적이지 "
+"않습니다. 이제 이 주제를 더 자세히 살펴볼 준비가 되셨습니다. 각 클라이언트에"
+"서 서로 다른 CIFAR-10의 하위 집합을 사용해 보는 것은 어떨까요? 클라이언트를 "
+"더 추가하는 것은 어떨까요?"
#: ../../source/explanation-differential-privacy.rst:2
#: ../../source/explanation-differential-privacy.rst:11
@@ -3144,27 +3199,26 @@ msgstr "차분 프라이버시"
#: ../../source/explanation-differential-privacy.rst:3
msgid ""
-"The information in datasets like healthcare, financial transactions, user"
-" preferences, etc., is valuable and has the potential for scientific "
-"breakthroughs and provides important business insights. However, such "
-"data is also sensitive and there is a risk of compromising individual "
-"privacy."
+"The information in datasets like healthcare, financial transactions, user "
+"preferences, etc., is valuable and has the potential for scientific "
+"breakthroughs and provides important business insights. However, such data "
+"is also sensitive and there is a risk of compromising individual privacy."
msgstr ""
-"의료, 금융 거래, 사용자 선호도 등과 같은 데이터 세트의 정보는 가치 있고 "
-"과학적 혁신의 잠재력을 지니고 있으며 중요한 비즈니스 인사이트를 제공합니다. "
-"그러나 이러한 데이터는 또한 민감한 정보이며 개인의 프라이버시를 침해할 "
-"위험이 있습니다."
+"의료, 금융 거래, 사용자 선호도 등과 같은 데이터 세트의 정보는 가치 있고 과학"
+"적 혁신의 잠재력을 지니고 있으며 중요한 비즈니스 인사이트를 제공합니다. 그러"
+"나 이러한 데이터는 또한 민감한 정보이며 개인의 프라이버시를 침해할 위험이 있"
+"습니다."
#: ../../source/explanation-differential-privacy.rst:6
msgid ""
"Traditional methods like anonymization alone would not work because of "
-"attacks like Re-identification and Data Linkage. That's where "
-"differential privacy comes in. It provides the possibility of analyzing "
-"data while ensuring the privacy of individuals."
+"attacks like Re-identification and Data Linkage. That's where differential "
+"privacy comes in. It provides the possibility of analyzing data while "
+"ensuring the privacy of individuals."
msgstr ""
-"익명화와 같은 기존 방법만으로는 재식별 및 데이터 연결과 같은 공격으로 인해 "
-"효과가 없습니다. 그래서 차분 프라이버시가 등장했습니다. 차등 개인정보 보호는 "
-"개인의 프라이버시를 보장하면서 데이터를 분석할 수 있는 가능성을 제공합니다."
+"익명화와 같은 기존 방법만으로는 재식별 및 데이터 연결과 같은 공격으로 인해 효"
+"과가 없습니다. 그래서 차분 프라이버시가 등장했습니다. 차등 개인정보 보호는 개"
+"인의 프라이버시를 보장하면서 데이터를 분석할 수 있는 가능성을 제공합니다."
#: ../../source/explanation-differential-privacy.rst:12
msgid ""
@@ -3172,8 +3226,8 @@ msgid ""
"instance, Alice's data). Differential Privacy (DP) guarantees that any "
"analysis (M), like calculating the average income, will produce nearly "
"identical results for both datasets (O and O' would be similar). This "
-"preserves group patterns while obscuring individual details, ensuring the"
-" individual's information remains hidden in the crowd."
+"preserves group patterns while obscuring individual details, ensuring the "
+"individual's information remains hidden in the crowd."
msgstr ""
"하나의 레코드(예: 앨리스의 데이터)를 제외하고는 동일한 두 개의 데이터 세트가 "
"있다고 상상해 보세요. 차분 프라이버(DP)는 평균 소득 계산과 같은 모든 분석(M)"
@@ -3189,12 +3243,11 @@ msgstr "DP 소개"
msgid ""
"One of the most commonly used mechanisms to achieve DP is adding enough "
"noise to the output of the analysis to mask the contribution of each "
-"individual in the data while preserving the overall accuracy of the "
-"analysis."
+"individual in the data while preserving the overall accuracy of the analysis."
msgstr ""
-"DP를 달성하기 위해 가장 일반적으로 사용되는 메커니즘 중 하나는 분석의 "
-"전반적인 정확도를 유지하면서 데이터에서 각 개인의 기여도를 가릴 수 있도록 "
-"분석 결과에 충분한 노이즈를 추가하는 것입니다."
+"DP를 달성하기 위해 가장 일반적으로 사용되는 메커니즘 중 하나는 분석의 전반적"
+"인 정확도를 유지하면서 데이터에서 각 개인의 기여도를 가릴 수 있도록 분석 결과"
+"에 충분한 노이즈를 추가하는 것입니다."
#: ../../source/explanation-differential-privacy.rst:25
msgid "Formal Definition"
@@ -3204,19 +3257,19 @@ msgstr "공식 정의"
msgid ""
"Differential Privacy (DP) provides statistical guarantees against the "
"information an adversary can infer through the output of a randomized "
-"algorithm. It provides an unconditional upper bound on the influence of a"
-" single individual on the output of the algorithm by adding noise [1]. A "
-"randomized mechanism M provides (:math:`\\epsilon`, "
-":math:`\\delta`)-differential privacy if for any two neighboring "
-"databases, D :sub:`1` and D :sub:`2`, that differ in only a single "
-"record, and for all possible outputs S ⊆ Range(A):"
+"algorithm. It provides an unconditional upper bound on the influence of a "
+"single individual on the output of the algorithm by adding noise [1]. A "
+"randomized mechanism M provides (:math:`\\epsilon`, :math:`\\delta`)-"
+"differential privacy if for any two neighboring databases, D :sub:`1` and D :"
+"sub:`2`, that differ in only a single record, and for all possible outputs S "
+"⊆ Range(A):"
msgstr ""
"차분 프라이버시(DP)는 공격자가 무작위 알고리즘의 출력을 통해 유추할 수 있는 "
-"정보에 대해 통계적 보장을 제공합니다. 이는 노이즈를 추가하여 알고리즘의 "
-"출력에 대한 한 개인의 영향력에 대한 무조건적인 상한선을 제공합니다[1]. "
-"무작위 메커니즘 M은 하나의 레코드만 다른 두 개의 인접 데이터베이스인 "
-"D:sub:`1`과 D:sub:`2`의 경우, 가능한 모든 출력 S ⊆ Range(A)에 대해 (:math:`"
-"\\epsilon`, :math:`\\delta`)-차분 프라이버시를 제공합니다:"
+"정보에 대해 통계적 보장을 제공합니다. 이는 노이즈를 추가하여 알고리즘의 출력"
+"에 대한 한 개인의 영향력에 대한 무조건적인 상한선을 제공합니다[1]. 무작위 메"
+"커니즘 M은 하나의 레코드만 다른 두 개의 인접 데이터베이스인 D:sub:`1`과 D:"
+"sub:`2`의 경우, 가능한 모든 출력 S ⊆ Range(A)에 대해 (:math:`\\epsilon`, :"
+"math:`\\delta`)-차분 프라이버시를 제공합니다:"
#: ../../source/explanation-differential-privacy.rst:32
msgid ""
@@ -3231,19 +3284,19 @@ msgid ""
"The :math:`\\epsilon` parameter, also known as the privacy budget, is a "
"metric of privacy loss. It also controls the privacy-utility trade-off; "
"lower :math:`\\epsilon` values indicate higher levels of privacy but are "
-"likely to reduce utility as well. The :math:`\\delta` parameter accounts "
-"for a small probability on which the upper bound :math:`\\epsilon` does "
-"not hold. The amount of noise needed to achieve differential privacy is "
-"proportional to the sensitivity of the output, which measures the maximum"
-" change in the output due to the inclusion or removal of a single record."
+"likely to reduce utility as well. The :math:`\\delta` parameter accounts for "
+"a small probability on which the upper bound :math:`\\epsilon` does not "
+"hold. The amount of noise needed to achieve differential privacy is "
+"proportional to the sensitivity of the output, which measures the maximum "
+"change in the output due to the inclusion or removal of a single record."
msgstr ""
"프라이버시 예산이라고도 하는 :math:`\\epsilon` 매개변수는 프라이버시 손실을 "
-"측정하는 지표입니다. 이 매개변수는 프라이버시와 효용의 균형을 제어하며, "
-":math:`\\epsilon` 값이 낮을수록 프라이버시 수준이 높지만 효용도 감소할 "
-"가능성이 높습니다. math:`\\delta` 매개변수는 상한값인 :math:`\\epsilon`이 "
-"적용되지 않는 작은 확률을 설명합니다. 차분 프라이버시를 달성하는 데 필요한 "
-"노이즈의 양은 출력의 감도에 비례하며, 이는 단일 레코드의 포함 또는 제거로 "
-"인한 출력의 최대 변화를 측정합니다."
+"측정하는 지표입니다. 이 매개변수는 프라이버시와 효용의 균형을 제어하며, :"
+"math:`\\epsilon` 값이 낮을수록 프라이버시 수준이 높지만 효용도 감소할 가능성"
+"이 높습니다. math:`\\delta` 매개변수는 상한값인 :math:`\\epsilon`이 적용되지 "
+"않는 작은 확률을 설명합니다. 차분 프라이버시를 달성하는 데 필요한 노이즈의 양"
+"은 출력의 감도에 비례하며, 이는 단일 레코드의 포함 또는 제거로 인한 출력의 최"
+"대 변화를 측정합니다."
#: ../../source/explanation-differential-privacy.rst:45
msgid "Differential Privacy in Machine Learning"
@@ -3253,40 +3306,39 @@ msgstr "머신 러닝의 차분 프라이버시"
msgid ""
"DP can be utilized in machine learning to preserve the privacy of the "
"training data. Differentially private machine learning algorithms are "
-"designed in a way to prevent the algorithm to learn any specific "
-"information about any individual data points and subsequently prevent the"
-" model from revealing sensitive information. Depending on the stage at "
-"which noise is introduced, various methods exist for applying DP to "
-"machine learning algorithms. One approach involves adding noise to the "
-"training data (either to the features or labels), while another method "
-"entails injecting noise into the gradients of the loss function during "
-"model training. Additionally, such noise can be incorporated into the "
-"model's output."
-msgstr ""
-"머신 러닝에서 DP를 활용하여 학습 데이터의 개인정보를 보호할 수 있습니다. "
-"차분 비공개 머신 러닝 알고리즘은 알고리즘이 개별 데이터 포인트에 대한 특정 "
-"정보를 학습하지 못하도록 하여 모델이 민감한 정보를 노출하지 않도록 하는 "
-"방식으로 설계되었습니다. 노이즈가 도입되는 단계에 따라 머신 러닝 알고리즘에 "
-"DP를 적용하는 다양한 방법이 존재합니다. 한 가지 방법은 학습 데이터(특징 또는 "
-"레이블)에 노이즈를 추가하는 것이고, 다른 방법은 모델 학습 중에 손실 함수의 "
-"기울기에 노이즈를 주입하는 것입니다. 또한 이러한 노이즈를 모델의 출력에 "
-"통합할 수도 있습니다."
+"designed in a way to prevent the algorithm to learn any specific information "
+"about any individual data points and subsequently prevent the model from "
+"revealing sensitive information. Depending on the stage at which noise is "
+"introduced, various methods exist for applying DP to machine learning "
+"algorithms. One approach involves adding noise to the training data (either "
+"to the features or labels), while another method entails injecting noise "
+"into the gradients of the loss function during model training. Additionally, "
+"such noise can be incorporated into the model's output."
+msgstr ""
+"머신 러닝에서 DP를 활용하여 학습 데이터의 개인정보를 보호할 수 있습니다. 차"
+"분 비공개 머신 러닝 알고리즘은 알고리즘이 개별 데이터 포인트에 대한 특정 정보"
+"를 학습하지 못하도록 하여 모델이 민감한 정보를 노출하지 않도록 하는 방식으로 "
+"설계되었습니다. 노이즈가 도입되는 단계에 따라 머신 러닝 알고리즘에 DP를 적용"
+"하는 다양한 방법이 존재합니다. 한 가지 방법은 학습 데이터(특징 또는 레이블)"
+"에 노이즈를 추가하는 것이고, 다른 방법은 모델 학습 중에 손실 함수의 기울기에 "
+"노이즈를 주입하는 것입니다. 또한 이러한 노이즈를 모델의 출력에 통합할 수도 있"
+"습니다."
#: ../../source/explanation-differential-privacy.rst:53
msgid "Differential Privacy in Federated Learning"
-msgstr "Federated 학습의 차분 프라이버시"
+msgstr "연합 학습의 차분 프라이버시"
#: ../../source/explanation-differential-privacy.rst:54
msgid ""
"Federated learning is a data minimization approach that allows multiple "
"parties to collaboratively train a model without sharing their raw data. "
"However, federated learning also introduces new privacy challenges. The "
-"model updates between parties and the central server can leak information"
-" about the local data. These leaks can be exploited by attacks such as "
+"model updates between parties and the central server can leak information "
+"about the local data. These leaks can be exploited by attacks such as "
"membership inference and property inference attacks, or model inversion "
"attacks."
msgstr ""
-"Federated 학습은 여러 당사자가 원시 데이터를 공유하지 않고도 공동으로 모델을 "
+"연합 학습은 여러 당사자가 원시 데이터를 공유하지 않고도 공동으로 모델을 "
"학습할 수 있는 데이터 최소화 접근 방식입니다. 그러나 연합 학습은 새로운 "
"개인정보 보호 문제를 야기하기도 합니다. 당사자와 중앙 서버 간의 모델 "
"업데이트는 로컬 데이터에 대한 정보를 유출할 수 있습니다. 이러한 유출은 "
@@ -3295,43 +3347,43 @@ msgstr ""
#: ../../source/explanation-differential-privacy.rst:58
msgid ""
-"DP can play a crucial role in federated learning to provide privacy for "
-"the clients' data."
-msgstr "DP는 federated학습에서 클라이언트의 데이터에 대한 개인 정보 보호를 제공하는 "
-"데 중요한 역할을 할 수 있습니다."
+"DP can play a crucial role in federated learning to provide privacy for the "
+"clients' data."
+msgstr "DP는 연합 학습에서 클라이언트의 데이터에 대한 개인 정보 보호를 제공하는 데 "
+"중요한 역할을 할 수 있습니다."
#: ../../source/explanation-differential-privacy.rst:60
msgid ""
-"Depending on the granularity of privacy provision or the location of "
-"noise addition, different forms of DP exist in federated learning. In "
-"this explainer, we focus on two approaches of DP utilization in federated"
-" learning based on where the noise is added: at the server (also known as"
-" the center) or at the client (also known as the local)."
+"Depending on the granularity of privacy provision or the location of noise "
+"addition, different forms of DP exist in federated learning. In this "
+"explainer, we focus on two approaches of DP utilization in federated "
+"learning based on where the noise is added: at the server (also known as the "
+"center) or at the client (also known as the local)."
msgstr ""
-"개인 정보 제공의 세분성 또는 노이즈 추가 위치에 따라 federated 학습에는 "
-"다양한 형태의 DP가 존재합니다. 이 설명에서는 노이즈가 추가되는 위치에 따라 "
-"서버(중앙이라고도 함) 또는 클라이언트(로컬이라고도 함)에서의 federated "
-"학습에서 DP를 활용하는 두 가지 접근 방식에 중점을 둡니다."
+"개인 정보 제공의 세분성 또는 노이즈 추가 위치에 따라 연합 학습에는 다양한 "
+"형태의 DP가 존재합니다. 이 설명에서는 노이즈가 추가되는 위치에 따라 서버("
+"중앙이라고도 함) 또는 클라이언트(로컬이라고도 함)에서의 연합 학습에서 DP를 "
+"활용하는 두 가지 접근 방식에 중점을 둡니다."
#: ../../source/explanation-differential-privacy.rst:63
msgid ""
-"**Central Differential Privacy**: DP is applied by the server and the "
-"goal is to prevent the aggregated model from leaking information about "
-"each client's data."
+"**Central Differential Privacy**: DP is applied by the server and the goal "
+"is to prevent the aggregated model from leaking information about each "
+"client's data."
msgstr ""
-"**중앙 차분 프라이버시**: DP는 서버에서 적용되며 집계된 모델이 각 "
-"클라이언트의 데이터에 대한 정보를 유출하는 것을 방지하는 것이 목표입니다."
+"**중앙 차분 프라이버시**: DP는 서버에서 적용되며 집계된 모델이 각 클라이언트"
+"의 데이터에 대한 정보를 유출하는 것을 방지하는 것이 목표입니다."
#: ../../source/explanation-differential-privacy.rst:65
msgid ""
"**Local Differential Privacy**: DP is applied on the client side before "
-"sending any information to the server and the goal is to prevent the "
-"updates that are sent to the server from leaking any information about "
-"the client's data."
+"sending any information to the server and the goal is to prevent the updates "
+"that are sent to the server from leaking any information about the client's "
+"data."
msgstr ""
-"**로컬 차분 개인정보 보호**: DP는 정보를 서버로 보내기 전에 클라이언트 "
-"측에서 적용되며, 서버로 전송되는 업데이트가 클라이언트 데이터에 대한 정보를 "
-"유출하는 것을 방지하는 것이 목표입니다."
+"**로컬 차분 개인정보 보호**: DP는 정보를 서버로 보내기 전에 클라이언트 측에"
+"서 적용되며, 서버로 전송되는 업데이트가 클라이언트 데이터에 대한 정보를 유출"
+"하는 것을 방지하는 것이 목표입니다."
#: ../../source/explanation-differential-privacy.rst:-1
#: ../../source/explanation-differential-privacy.rst:68
@@ -3341,30 +3393,30 @@ msgstr "중앙 차분 프라이버시"
#: ../../source/explanation-differential-privacy.rst:69
msgid ""
-"In this approach, which is also known as user-level DP, the central "
-"server is responsible for adding noise to the globally aggregated "
-"parameters. It should be noted that trust in the server is required."
+"In this approach, which is also known as user-level DP, the central server "
+"is responsible for adding noise to the globally aggregated parameters. It "
+"should be noted that trust in the server is required."
msgstr ""
-"사용자 수준 DP라고도 하는 이 접근 방식에서는 중앙 서버가 전역적으로 집계된 "
-"매개변수에 노이즈를 추가하는 역할을 담당합니다. 서버에 대한 신뢰가 "
-"필요하다는 점에 유의해야 합니다."
+"사용자 수준 DP라고도 하는 이 접근 방식에서는 중앙 서버가 전역적으로 집계된 매"
+"개변수에 노이즈를 추가하는 역할을 담당합니다. 서버에 대한 신뢰가 필요하다는 "
+"점에 유의해야 합니다."
#: ../../source/explanation-differential-privacy.rst:76
msgid ""
-"While there are various ways to implement central DP in federated "
-"learning, we concentrate on the algorithms proposed by [2] and [3]. The "
-"overall approach is to clip the model updates sent by the clients and add"
-" some amount of noise to the aggregated model. In each iteration, a "
-"random set of clients is chosen with a specific probability for training."
-" Each client performs local training on its own data. The update of each "
-"client is then clipped by some value `S` (sensitivity `S`). This would "
-"limit the impact of any individual client which is crucial for privacy "
-"and often beneficial for robustness. A common approach to achieve this is"
-" by restricting the `L2` norm of the clients' model updates, ensuring "
-"that larger updates are scaled down to fit within the norm `S`."
-msgstr ""
-"federated 학습에서 중앙 DP를 구현하는 방법은 여러 가지가 있지만, 여기서는 [2]"
-"와 [3]에서 제안한 알고리즘에 집중합니다. 전반적인 접근 방식은 클라이언트가 "
+"While there are various ways to implement central DP in federated learning, "
+"we concentrate on the algorithms proposed by [2] and [3]. The overall "
+"approach is to clip the model updates sent by the clients and add some "
+"amount of noise to the aggregated model. In each iteration, a random set of "
+"clients is chosen with a specific probability for training. Each client "
+"performs local training on its own data. The update of each client is then "
+"clipped by some value `S` (sensitivity `S`). This would limit the impact of "
+"any individual client which is crucial for privacy and often beneficial for "
+"robustness. A common approach to achieve this is by restricting the `L2` "
+"norm of the clients' model updates, ensuring that larger updates are scaled "
+"down to fit within the norm `S`."
+msgstr ""
+"연합 학습에서 중앙 DP를 구현하는 방법은 여러 가지가 있지만, 여기서는 [2]와 "
+"[3]에서 제안한 알고리즘에 집중합니다. 전반적인 접근 방식은 클라이언트가 "
"전송한 모델 업데이트를 잘라내고 집계된 모델에 약간의 노이즈를 추가하는 "
"것입니다. 각 반복에서 특정 확률로 훈련할 무작위 클라이언트 세트가 "
"선택됩니다. 각 클라이언트는 자체 데이터에 대해 로컬 학습을 수행합니다. 그런 "
@@ -3380,17 +3432,17 @@ msgstr "클리핑"
#: ../../source/explanation-differential-privacy.rst:89
msgid ""
-"Afterwards, the Gaussian mechanism is used to add noise in order to "
-"distort the sum of all clients' updates. The amount of noise is scaled to"
-" the sensitivity value to obtain a privacy guarantee. The Gaussian "
-"mechanism is used with a noise sampled from `N (0, σ²)` where `σ = ( "
-"noise_scale * S ) / (number of sampled clients)`."
+"Afterwards, the Gaussian mechanism is used to add noise in order to distort "
+"the sum of all clients' updates. The amount of noise is scaled to the "
+"sensitivity value to obtain a privacy guarantee. The Gaussian mechanism is "
+"used with a noise sampled from `N (0, σ²)` where `σ = ( noise_scale * S ) / "
+"(number of sampled clients)`."
msgstr ""
-"그 후 가우시안 메커니즘을 사용하여 모든 클라이언트의 업데이트 합계를 "
-"왜곡하기 위해 노이즈를 추가합니다. 노이즈의 양은 감도 값에 따라 조정되어 "
-"프라이버시 보장을 얻습니다. 가우시안 메커니즘은 `N (0, σ²)`에서 샘플링된 "
-"노이즈와 함께 사용됩니다. 여기서 `σ = (noise_scale * S) / (샘플링된 "
-"클라이언트 수)`입니다."
+"그 후 가우시안 메커니즘을 사용하여 모든 클라이언트의 업데이트 합계를 왜곡하"
+"기 위해 노이즈를 추가합니다. 노이즈의 양은 감도 값에 따라 조정되어 프라이버"
+"시 보장을 얻습니다. 가우시안 메커니즘은 `N (0, σ²)`에서 샘플링된 노이즈와 함"
+"께 사용됩니다. 여기서 `σ = (noise_scale * S) / (샘플링된 클라이언트 수)`입니"
+"다."
#: ../../source/explanation-differential-privacy.rst:94
msgid "Clipping"
@@ -3398,39 +3450,40 @@ msgstr "클리핑"
#: ../../source/explanation-differential-privacy.rst:96
msgid ""
-"There are two forms of clipping commonly used in Central DP: Fixed "
-"Clipping and Adaptive Clipping."
-msgstr "Central DP에서 일반적으로 사용되는 클리핑에는 고정 클리핑과 조정 클리핑의 두 "
+"There are two forms of clipping commonly used in Central DP: Fixed Clipping "
+"and Adaptive Clipping."
+msgstr "중앙 DP에서 일반적으로 사용되는 클리핑에는 고정 클리핑과 조정 클리핑의 두 "
"가지 형태가 있습니다."
#: ../../source/explanation-differential-privacy.rst:98
msgid ""
-"**Fixed Clipping** : A predefined fix threshold is set for the magnitude "
-"of clients' updates. Any update exceeding this threshold is clipped back "
-"to the threshold value."
+"**Fixed Clipping** : A predefined fix threshold is set for the magnitude of "
+"clients' updates. Any update exceeding this threshold is clipped back to the "
+"threshold value."
msgstr ""
-"**고정 클리핑** : 클라이언트의 업데이트 크기에 대해 미리 정의된 고정 "
-"임계값이 설정됩니다. 이 임계값을 초과하는 모든 업데이트는 임계값으로 다시 "
-"클리핑됩니다."
+"**고정 클리핑** : 클라이언트의 업데이트 크기에 대해 미리 정의된 고정 임계값"
+"이 설정됩니다. 이 임계값을 초과하는 모든 업데이트는 임계값으로 다시 클리핑됩"
+"니다."
#: ../../source/explanation-differential-privacy.rst:100
msgid ""
-"**Adaptive Clipping** : The clipping threshold dynamically adjusts based "
-"on the observed update distribution [4]. It means that the clipping value"
-" is tuned during the rounds with respect to the quantile of the update "
-"norm distribution."
+"**Adaptive Clipping** : The clipping threshold dynamically adjusts based on "
+"the observed update distribution [4]. It means that the clipping value is "
+"tuned during the rounds with respect to the quantile of the update norm "
+"distribution."
msgstr ""
-"**조 클리핑** : 클리핑 임계값은 관찰된 업데이트 분포에 따라 동적으로 "
+"**조정 클리핑** : 클리핑 임계값은 관찰된 업데이트 분포에 따라 동적으로 "
"조정됩니다[4]. 즉, 클리핑 값은 업데이트 표준 분포의 사분위수에 따라 라운드가 "
"진행되는 동안 조정됩니다."
#: ../../source/explanation-differential-privacy.rst:102
msgid ""
-"The choice between fixed and adaptive clipping depends on various factors"
-" such as privacy requirements, data distribution, model complexity, and "
+"The choice between fixed and adaptive clipping depends on various factors "
+"such as privacy requirements, data distribution, model complexity, and "
"others."
-msgstr "고정 클리핑과 조정 클리핑 중 선택은 개인정보 보호 요구 사항, 데이터 배포, "
-"모델 복잡성 등 다양한 요인에 따라 달라집니다."
+msgstr ""
+"고정 클리핑과 조정 클리핑 중 선택은 개인정보 보호 요구 사항, 데이터 배포, 모"
+"델 복잡성 등 다양한 요인에 따라 달라집니다."
#: ../../source/explanation-differential-privacy.rst:-1
#: ../../source/explanation-differential-privacy.rst:105
@@ -3441,13 +3494,13 @@ msgstr "로컬 차분 프라이버시"
#: ../../source/explanation-differential-privacy.rst:107
msgid ""
"In this approach, each client is responsible for performing DP. Local DP "
-"avoids the need for a fully trusted aggregator, but it should be noted "
-"that local DP leads to a decrease in accuracy but better privacy in "
-"comparison to central DP."
+"avoids the need for a fully trusted aggregator, but it should be noted that "
+"local DP leads to a decrease in accuracy but better privacy in comparison to "
+"central DP."
msgstr ""
-"이 접근 방식에서는 각 클라이언트가 DP를 수행할 책임이 있습니다. 로컬 DP는 "
-"완전히 신뢰할 수 있는 애그리게이터가 필요하지 않지만, 로컬 DP는 중앙 DP에 "
-"비해 정확도는 떨어져도 개인 정보 보호는 더 우수하다는 점에 유의해야 합니다."
+"이 접근 방식에서는 각 클라이언트가 DP를 수행할 책임이 있습니다. 로컬 DP는 완"
+"전히 신뢰할 수 있는 애그리게이터가 필요하지 않지만, 로컬 DP는 중앙 DP에 비해 "
+"정확도는 떨어져도 개인 정보 보호는 더 우수하다는 점에 유의해야 합니다."
#: ../../source/explanation-differential-privacy.rst:116
msgid "In this explainer, we focus on two forms of achieving Local DP:"
@@ -3456,25 +3509,25 @@ msgstr "이 설명에서는 로컬 DP를 달성하는 두 가지 형태에 중
#: ../../source/explanation-differential-privacy.rst:118
msgid ""
"Each client adds noise to the local updates before sending them to the "
-"server. To achieve (:math:`\\epsilon`, :math:`\\delta`)-DP, considering "
-"the sensitivity of the local model to be ∆, Gaussian noise is applied "
-"with a noise scale of σ where:"
+"server. To achieve (:math:`\\epsilon`, :math:`\\delta`)-DP, considering the "
+"sensitivity of the local model to be ∆, Gaussian noise is applied with a "
+"noise scale of σ where:"
msgstr ""
"각 클라이언트는 로컬 업데이트를 서버로 보내기 전에 로컬 업데이트에 노이즈를 "
-"추가합니다. 로컬 모델의 감도를 ∆로 간주하여 가우시안 노이즈가 σ의 노이즈 "
-"스케일로 적용되어 (:math:`\\epsilon`, :math:`\\delta`)-DP를 달성하기 위해, "
-"여기서 σ는 노이즈 스케일입니다:"
+"추가합니다. 로컬 모델의 감도를 ∆로 간주하여 가우시안 노이즈가 σ의 노이즈 스케"
+"일로 적용되어 (:math:`\\epsilon`, :math:`\\delta`)-DP를 달성하기 위해, 여기"
+"서 σ는 노이즈 스케일입니다:"
#: ../../source/explanation-differential-privacy.rst:120
msgid ""
"\\small\n"
-"\\frac{∆ \\times \\sqrt{2 \\times "
-"\\log\\left(\\frac{1.25}{\\delta}\\right)}}{\\epsilon}\n"
+"\\frac{∆ \\times \\sqrt{2 \\times \\log\\left(\\frac{1.25}{\\delta}\\right)}}"
+"{\\epsilon}\n"
"\n"
msgstr ""
"\\small\n"
-"\\frac{∆ \\times \\sqrt{2 \\times \\log\\left(\\frac{1.25}{\\delta}\\right"
-")}}{\\epsilon}\n"
+"\\frac{∆ \\times \\sqrt{2 \\times \\log\\left(\\frac{1.25}{\\delta}\\right)}}"
+"{\\epsilon}\n"
"\n"
#: ../../source/explanation-differential-privacy.rst:125
@@ -3483,15 +3536,16 @@ msgid ""
"training (DP-SGD). More specifically, in this approach, gradients are "
"clipped and an amount of calibrated noise is injected into the gradients."
msgstr ""
-"각 클라이언트는 로컬 트레이닝(DP-SGD) 중에 모델의 gradient에 노이즈를 "
-"추가합니다. 보다 구체적으로, 이 접근 방식에서는 gradient이 클리핑되고 보정된 "
-"노이즈가 gradient에 주입됩니다."
+"각 클라이언트는 로컬 트레이닝(DP-SGD) 중에 모델의 gradient에 노이즈를 추가합"
+"니다. 보다 구체적으로, 이 접근 방식에서는 gradient이 클리핑되고 보정된 노이즈"
+"가 gradient에 주입됩니다."
#: ../../source/explanation-differential-privacy.rst:128
msgid ""
"Please note that these two approaches are providing privacy at different "
"levels."
-msgstr "이 두 가지 접근 방식은 서로 다른 수준의 개인정보 보호 기능을 제공한다는 점에 "
+msgstr ""
+"이 두 가지 접근 방식은 서로 다른 수준의 개인정보 보호 기능을 제공한다는 점에 "
"유의하세요."
#: ../../source/explanation-differential-privacy.rst:131
@@ -3504,38 +3558,37 @@ msgstr "[1] Dwork 외. 차분 프라이버시의 알고리즘적 기초."
#: ../../source/explanation-differential-privacy.rst:135
msgid ""
-"[2] McMahan et al. Learning Differentially Private Recurrent Language "
-"Models."
+"[2] McMahan et al. Learning Differentially Private Recurrent Language Models."
msgstr "[2] McMahan 외. 차분적 개인 반복 언어 모델 학습."
#: ../../source/explanation-differential-privacy.rst:137
msgid ""
-"[3] Geyer et al. Differentially Private Federated Learning: A Client "
-"Level Perspective."
-msgstr "[3] Geyer 외. 차분적 개인 Federated 학습: 고객 수준의 관점."
+"[3] Geyer et al. Differentially Private Federated Learning: A Client Level "
+"Perspective."
+msgstr "[3] Geyer 외. 차분적 개인 연합 학습: 고객 수준의 관점."
#: ../../source/explanation-differential-privacy.rst:139
-msgid "[4] Galen et al. Differentially Private Learning with Adaptive Clipping."
+msgid ""
+"[4] Galen et al. Differentially Private Learning with Adaptive Clipping."
msgstr "[4] Galen 외. 조정형 클리핑을 통한 차분적 개인 학습."
#: ../../source/explanation-federated-evaluation.rst:2
#: ../../source/tutorial-series-what-is-federated-learning.ipynb:292
msgid "Federated evaluation"
-msgstr "Federated 평가"
+msgstr "연합 평가"
#: ../../source/explanation-federated-evaluation.rst:4
msgid ""
"There are two main approaches to evaluating models in federated learning "
-"systems: centralized (or server-side) evaluation and federated (or "
-"client-side) evaluation."
+"systems: centralized (or server-side) evaluation and federated (or client-"
+"side) evaluation."
msgstr ""
-"federated 학습 시스템에서 모델을 평가하는 데는 centralized(또는 서버 측) "
-"평가와 federated(또는 클라이언트 측) 평가라는 두 가지 주요 접근 방식이 "
-"있습니다."
+"연합 학습 시스템에서 모델을 평가하는 데는 중앙 집중식(또는 서버 측) 평가와 "
+"연합(또는 클라이언트 측) 평가라는 두 가지 주요 접근 방식이 있습니다."
#: ../../source/explanation-federated-evaluation.rst:8
msgid "Centralized Evaluation"
-msgstr "Centralized 평가"
+msgstr "중앙 집중식 평가"
#: ../../source/explanation-federated-evaluation.rst:11
msgid "Built-In Strategies"
@@ -3548,7 +3601,7 @@ msgid ""
"function that can take the current global model parameters as input and "
"return evaluation results:"
msgstr ""
-"모든 기본 제공 전략은 초기화 중에 평가 함수를 제공하여 centralized 평가를 "
+"모든 기본 제공 전략은 초기화 중에 평가 함수를 제공하여 중앙 집중식 평가를 "
"지원합니다. 평가 함수는 현재 글로벌 모델 파라미터를 입력으로 받아 평가 "
"결과를 반환할 수 있는 모든 함수입니다:"
@@ -3558,97 +3611,95 @@ msgstr "사용자 정의 전략"
#: ../../source/explanation-federated-evaluation.rst:60
msgid ""
-"The :code:`Strategy` abstraction provides a method called "
-":code:`evaluate` that can directly be used to evaluate the current global"
-" model parameters. The current server implementation calls "
-":code:`evaluate` after parameter aggregation and before federated "
-"evaluation (see next paragraph)."
+"The :code:`Strategy` abstraction provides a method called :code:`evaluate` "
+"that can directly be used to evaluate the current global model parameters. "
+"The current server implementation calls :code:`evaluate` after parameter "
+"aggregation and before federated evaluation (see next paragraph)."
msgstr ""
-"코드:`전략` 추상화는 현재 전역 모델 파라미터를 평가하는 데 직접 사용할 수 "
-"있는 :코드:`평가`라는 메서드를 제공합니다. 현재 서버 구현에서는 매개변수 "
-"집계 후와 연합 평가 전에 :code:`evaluate`를 호출합니다(다음 단락 참조)."
+"코드:`전략` 추상화는 현재 전역 모델 파라미터를 평가하는 데 직접 사용할 수 있"
+"는 :코드:`평가`라는 메서드를 제공합니다. 현재 서버 구현에서는 매개변수 집계 "
+"후와 연합 평가 전에 :code:`evaluate`를 호출합니다(다음 단락 참조)."
#: ../../source/explanation-federated-evaluation.rst:65
msgid "Federated Evaluation"
-msgstr "Federated 평가"
+msgstr "연합 평가"
#: ../../source/explanation-federated-evaluation.rst:68
msgid "Implementing Federated Evaluation"
-msgstr "Federated 평가 구현"
+msgstr "연합 평가 구현"
#: ../../source/explanation-federated-evaluation.rst:70
msgid ""
-"Client-side evaluation happens in the :code:`Client.evaluate` method and "
-"can be configured from the server side."
-msgstr "클라이언트 측 평가는 :code:`Client.evaluate` 메서드에서 이루어지며 서버 "
-"측에서 구성할 수 있습니다."
+"Client-side evaluation happens in the :code:`Client.evaluate` method and can "
+"be configured from the server side."
+msgstr ""
+"클라이언트 측 평가는 :code:`Client.evaluate` 메서드에서 이루어지며 서버 측에"
+"서 구성할 수 있습니다."
#: ../../source/explanation-federated-evaluation.rst:101
msgid "Configuring Federated Evaluation"
-msgstr "Federated 평가 구성"
+msgstr "연합 평가 구성"
#: ../../source/explanation-federated-evaluation.rst:103
msgid ""
"Federated evaluation can be configured from the server side. Built-in "
"strategies support the following arguments:"
-msgstr "Federated 평가는 서버 측에서 구성할 수 있습니다. 기본 제공 전략은 다음 "
-"인수를 지원합니다:"
+msgstr "연합 평가는 서버 측에서 구성할 수 있습니다. 기본 제공 전략은 다음 인수를 "
+"지원합니다:"
#: ../../source/explanation-federated-evaluation.rst:105
msgid ""
-":code:`fraction_evaluate`: a :code:`float` defining the fraction of "
-"clients that will be selected for evaluation. If "
-":code:`fraction_evaluate` is set to :code:`0.1` and :code:`100` clients "
-"are connected to the server, then :code:`10` will be randomly selected "
-"for evaluation. If :code:`fraction_evaluate` is set to :code:`0.0`, "
-"federated evaluation will be disabled."
+":code:`fraction_evaluate`: a :code:`float` defining the fraction of clients "
+"that will be selected for evaluation. If :code:`fraction_evaluate` is set "
+"to :code:`0.1` and :code:`100` clients are connected to the server, then :"
+"code:`10` will be randomly selected for evaluation. If :code:"
+"`fraction_evaluate` is set to :code:`0.0`, federated evaluation will be "
+"disabled."
msgstr ""
":code:`fraction_evaluate`: 평가를 위해 선택될 클라이언트의 비율을 정의하는 "
":code:`float`입니다. 코드:`fraction_evaluate`가 :code:`0.1`로 설정되어 있고 "
":code:`100` 클라이언트가 서버에 연결되어 있는 경우 :code:`10`이 평가를 위해 "
"무작위로 선택됩니다. code:`fraction_evaluate`가 :code:`0.0`으로 설정된 경우 "
-"federated 평가가 비활성화됩니다."
+"연합 평가가 비활성화됩니다."
#: ../../source/explanation-federated-evaluation.rst:106
msgid ""
-":code:`min_evaluate_clients`: an :code:`int`: the minimum number of "
-"clients to be selected for evaluation. If :code:`fraction_evaluate` is "
-"set to :code:`0.1`, :code:`min_evaluate_clients` is set to 20, and "
-":code:`100` clients are connected to the server, then :code:`20` clients "
-"will be selected for evaluation."
+":code:`min_evaluate_clients`: an :code:`int`: the minimum number of clients "
+"to be selected for evaluation. If :code:`fraction_evaluate` is set to :code:"
+"`0.1`, :code:`min_evaluate_clients` is set to 20, and :code:`100` clients "
+"are connected to the server, then :code:`20` clients will be selected for "
+"evaluation."
msgstr ""
-":code:`min_evaluate_clients`: 평가를 위해 선택할 최소 클라이언트 수. "
-":code:`int`. 코드:`fraction_evaluate`가 :code:`0.1`로 설정되어 있고 "
-":code:`fraction_evaluate`가 20으로 설정되어 있으며 :code:`100` 클라이언트가 "
-"서버에 연결되어 있는 경우 :code:`20` 클라이언트가 평가를 위해 선택됩니다."
+":code:`min_evaluate_clients`: 평가를 위해 선택할 최소 클라이언트 수. :code:"
+"`int`. 코드:`fraction_evaluate`가 :code:`0.1`로 설정되어 있고 :code:"
+"`fraction_evaluate`가 20으로 설정되어 있으며 :code:`100` 클라이언트가 서버에 "
+"연결되어 있는 경우 :code:`20` 클라이언트가 평가를 위해 선택됩니다."
#: ../../source/explanation-federated-evaluation.rst:107
msgid ""
":code:`min_available_clients`: an :code:`int` that defines the minimum "
-"number of clients which need to be connected to the server before a round"
-" of federated evaluation can start. If fewer than "
-":code:`min_available_clients` are connected to the server, the server "
-"will wait until more clients are connected before it continues to sample "
-"clients for evaluation."
-msgstr ""
-":code:`min_available_clients`: federated 평가 단계를 시작하기 전에 서버에 "
-"연결해야 하는 최소 클라이언트 수를 정의하는 :code:`int`입니다. 서버에 연결된 "
-"클라이언트가 :code:`min_available_clients`보다 적으면 서버는 더 많은 "
-"클라이언트가 연결될 때까지 기다렸다가 평가를 위한 클라이언트 샘플링을 "
-"계속합니다."
+"number of clients which need to be connected to the server before a round of "
+"federated evaluation can start. If fewer than :code:`min_available_clients` "
+"are connected to the server, the server will wait until more clients are "
+"connected before it continues to sample clients for evaluation."
+msgstr ""
+":code:`min_available_clients`: federated 평가 단계를 시작하기 전에 서버에 연"
+"결해야 하는 최소 클라이언트 수를 정의하는 :code:`int`입니다. 서버에 연결된 클"
+"라이언트가 :code:`min_available_clients`보다 적으면 서버는 더 많은 클라이언트"
+"가 연결될 때까지 기다렸다가 평가를 위한 클라이언트 샘플링을 계속합니다."
#: ../../source/explanation-federated-evaluation.rst:108
msgid ""
":code:`on_evaluate_config_fn`: a function that returns a configuration "
-"dictionary which will be sent to the selected clients. The function will "
-"be called during each round and provides a convenient way to customize "
-"client-side evaluation from the server side, for example, to configure "
-"the number of validation steps performed."
+"dictionary which will be sent to the selected clients. The function will be "
+"called during each round and provides a convenient way to customize client-"
+"side evaluation from the server side, for example, to configure the number "
+"of validation steps performed."
msgstr ""
-"code:`on_evaluate_config_fn`: 선택한 클라이언트로 전송할 구성 사전을 "
-"반환하는 함수입니다. 이 함수는 각 단계 중에 호출되며, 서버 측에서 클라이언트 "
-"측 평가를 사용자 지정하는 편리한 방법을 제공합니다(예: 수행되는 유효성 검사 "
-"단계 수 구성)."
+"code:`on_evaluate_config_fn`: 선택한 클라이언트로 전송할 구성 사전을 반환하"
+"는 함수입니다. 이 함수는 각 단계 중에 호출되며, 서버 측에서 클라이언트 측 평"
+"가를 사용자 지정하는 편리한 방법을 제공합니다(예: 수행되는 유효성 검사 단계 "
+"수 구성)."
#: ../../source/explanation-federated-evaluation.rst:135
msgid "Evaluating Local Model Updates During Training"
@@ -3656,9 +3707,8 @@ msgstr "훈련 중 로컬 모델 업데이트 평가"
#: ../../source/explanation-federated-evaluation.rst:137
msgid ""
-"Model parameters can also be evaluated during training. "
-":code:`Client.fit` can return arbitrary evaluation results as a "
-"dictionary:"
+"Model parameters can also be evaluated during training. :code:`Client.fit` "
+"can return arbitrary evaluation results as a dictionary:"
msgstr ""
"모델 파라미터는 훈련 중에도 평가할 수 있습니다. :code:`Client.fit`은 임의의 "
"평가 결과를 dictionary로 반환할 수 있습니다:"
@@ -3669,12 +3719,12 @@ msgstr "전체 코드 예제"
#: ../../source/explanation-federated-evaluation.rst:179
msgid ""
-"For a full code example that uses both centralized and federated "
-"evaluation, see the *Advanced TensorFlow Example* (the same approach can "
-"be applied to workloads implemented in any other framework): "
-"https://github.com/adap/flower/tree/main/examples/advanced-tensorflow"
+"For a full code example that uses both centralized and federated evaluation, "
+"see the *Advanced TensorFlow Example* (the same approach can be applied to "
+"workloads implemented in any other framework): https://github.com/adap/"
+"flower/tree/main/examples/advanced-tensorflow"
msgstr ""
-"federated 평가와 centralized 평가를 모두 사용하는 전체 코드 예제는 *고급 "
+"연합 평가와 중앙 집중식 평가를 모두 사용하는 전체 코드 예제는 *고급 "
"텐서플로우 예제*(다른 프레임워크에서 구현된 워크로드에도 동일한 접근 방식을 "
"적용할 수 있음)를 참조하세요: https://github.com/adap/flower/tree/main/"
"examples/advanced-tensorflow"
@@ -3850,13 +3900,13 @@ msgstr "운행 중 작업 추적을 위한 깃허브 이슈를 예약합니다"
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:37
msgid ""
-"ensure community participants can successfully drive changes to "
-"completion across one or more releases while stakeholders are adequately "
-"represented throughout the process"
+"ensure community participants can successfully drive changes to completion "
+"across one or more releases while stakeholders are adequately represented "
+"throughout the process"
msgstr ""
-"커뮤니티 참여자가 하나 이상의 릴리즈에서 변경 사항을 성공적으로 완료할 수 "
-"있도록 하는 동시에 이해 관계자가 프로세스 전반에 걸쳐 적절히 대표되도록 "
-"보장합니다"
+"커뮤니티 참여자가 하나 이상의 릴리즈에서 변경 사항을 성공적으로 완료할 수 있"
+"도록 하는 동시에 이해 관계자가 프로세스 전반에 걸쳐 적절히 대표되도록 보장합"
+"니다"
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:39
msgid "Hence, an Enhancement Doc combines aspects of"
@@ -3883,72 +3933,72 @@ msgstr "를 하나의 파일로 통합하여 커뮤니티와 협력해 점진적
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:49
msgid ""
"For far-fetching changes or features proposed to Flower, an abstraction "
-"beyond a single GitHub issue or pull request is required to understand "
-"and communicate upcoming changes to the project."
+"beyond a single GitHub issue or pull request is required to understand and "
+"communicate upcoming changes to the project."
msgstr ""
-"Flower에 제안된 변경 사항이나 기능을 멀리 가져오는 경우, 프로젝트의 향후 "
-"변경 사항을 이해하고 전달하기 위해 단일 GitHub 이슈 또는 pull request를 "
-"넘어서는 abstraction이 필요합니다."
+"Flower에 제안된 변경 사항이나 기능을 멀리 가져오는 경우, 프로젝트의 향후 변"
+"경 사항을 이해하고 전달하기 위해 단일 GitHub 이슈 또는 pull request를 넘어서"
+"는 abstraction이 필요합니다."
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:51
msgid ""
-"The purpose of this process is to reduce the amount of \"tribal "
-"knowledge\" in our community. By moving decisions from Slack threads, "
-"video calls, and hallway conversations into a well-tracked artifact, this"
-" process aims to enhance communication and discoverability."
+"The purpose of this process is to reduce the amount of \"tribal knowledge\" "
+"in our community. By moving decisions from Slack threads, video calls, and "
+"hallway conversations into a well-tracked artifact, this process aims to "
+"enhance communication and discoverability."
msgstr ""
-"이 프로세스의 목적은 커뮤니티 내 '부족한 지식'의 양을 줄이는 것입니다. 이 "
-"프로세스는 Slack 스레드, 영상 통화, 복도 대화에서 나온 의사 결정을 잘 추적된 "
-"아티팩트로 옮김으로써 커뮤니케이션과 검색 가능성을 향상시키는 것을 목표로 "
-"합니다."
+"이 프로세스의 목적은 커뮤니티 내 '부족한 지식'의 양을 줄이는 것입니다. 이 프"
+"로세스는 Slack 스레드, 영상 통화, 복도 대화에서 나온 의사 결정을 잘 추적된 아"
+"티팩트로 옮김으로써 커뮤니케이션과 검색 가능성을 향상시키는 것을 목표로 합니"
+"다."
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:55
msgid ""
-"Roughly any larger, user-facing enhancement should follow the Enhancement"
-" process. If an enhancement would be described in either written or "
-"verbal communication to anyone besides the author or developer, then "
-"consider creating an Enhancement Doc."
+"Roughly any larger, user-facing enhancement should follow the Enhancement "
+"process. If an enhancement would be described in either written or verbal "
+"communication to anyone besides the author or developer, then consider "
+"creating an Enhancement Doc."
msgstr ""
"대략적으로 사용자를 대상으로 하는 대규모 개선 사항은 개선 프로세스를 따라야 "
-"합니다. 개선 사항을 작성자나 개발자 이외의 다른 사람에게 서면 또는 구두로 "
-"설명해야 하는 경우에는 개선 문서 작성을 고려하세요."
+"합니다. 개선 사항을 작성자나 개발자 이외의 다른 사람에게 서면 또는 구두로 설"
+"명해야 하는 경우에는 개선 문서 작성을 고려하세요."
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:57
msgid ""
-"Similarly, any technical effort (refactoring, major architectural change)"
-" that will impact a large section of the development community should "
-"also be communicated widely. The Enhancement process is suited for this "
-"even if it will have zero impact on the typical user or operator."
+"Similarly, any technical effort (refactoring, major architectural change) "
+"that will impact a large section of the development community should also be "
+"communicated widely. The Enhancement process is suited for this even if it "
+"will have zero impact on the typical user or operator."
msgstr ""
-"마찬가지로 개발 커뮤니티의 많은 부분에 영향을 미치는 기술적 노력(리팩토링, "
-"주요 아키텍처 변경)도 널리 알려야 합니다. 개선 프로세스는 일반 사용자나 "
-"운영자에게 전혀 영향을 미치지 않더라도 이를 위해 적합합니다."
+"마찬가지로 개발 커뮤니티의 많은 부분에 영향을 미치는 기술적 노력(리팩토링, 주"
+"요 아키텍처 변경)도 널리 알려야 합니다. 개선 프로세스는 일반 사용자나 운영자"
+"에게 전혀 영향을 미치지 않더라도 이를 위해 적합합니다."
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:61
msgid ""
-"For small changes and additions, going through the Enhancement process "
-"would be time-consuming and unnecessary. This includes, for example, "
-"adding new Federated Learning algorithms, as these only add features "
-"without changing how Flower works or is used."
+"For small changes and additions, going through the Enhancement process would "
+"be time-consuming and unnecessary. This includes, for example, adding new "
+"Federated Learning algorithms, as these only add features without changing "
+"how Flower works or is used."
msgstr ""
"작은 변경 및 추가의 경우, 개선 프로세스를 거치는 것은 시간이 많이 걸리고 "
-"불필요합니다. 예를 들어, 새로운 Federated 학습 알고리즘을 추가하는 것은 "
-"Flower의 작동 방식이나 사용 방식을 변경하지 않고 기능만 추가하는 것이기 "
-"때문입니다."
+"불필요합니다. 예를 들어, 새로운 연합 학습 알고리즘을 추가하는 것은 Flower의 "
+"작동 방식이나 사용 방식을 변경하지 않고 기능만 추가하는 것이기 때문입니다."
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:63
msgid ""
"Enhancements are different from feature requests, as they are already "
-"providing a laid-out path for implementation and are championed by "
-"members of the community."
-msgstr "기능 개선은 이미 구현할 수 있는 경로가 마련되어 있고 커뮤니티 구성원들이 "
-"지지하는 것이므로 기능 요청과는 다릅니다."
+"providing a laid-out path for implementation and are championed by members "
+"of the community."
+msgstr ""
+"기능 개선은 이미 구현할 수 있는 경로가 마련되어 있고 커뮤니티 구성원들이 지지"
+"하는 것이므로 기능 요청과는 다릅니다."
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:67
msgid ""
"An Enhancement is captured in a Markdown file that follows a defined "
-"template and a workflow to review and store enhancement docs for "
-"reference — the Enhancement Doc."
+"template and a workflow to review and store enhancement docs for reference "
+"— the Enhancement Doc."
msgstr ""
"개선 사항은 정의된 템플릿과 참조용으로 Enhancement Doc.를 검토하고 저장하는 "
"워크플로우를 따르는 Markdown 파일에 캡처됩니다."
@@ -4002,11 +4052,11 @@ msgstr "Metadata"
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:92
msgid ""
-"**fed-number** (Required) The `fed-number` of the last Flower Enhancement"
-" Doc + 1. With this number, it becomes easy to reference other proposals."
+"**fed-number** (Required) The `fed-number` of the last Flower Enhancement "
+"Doc + 1. With this number, it becomes easy to reference other proposals."
msgstr ""
-"**피드 번호** (필수) 마지막 Flower Enhancement 문서의 `피드 번호` + 1. 이 "
-"번호를 사용하면 다른 제안을 쉽게 참조할 수 있습니다."
+"**피드 번호** (필수) 마지막 Flower Enhancement 문서의 `피드 번호` + 1. 이 번"
+"호를 사용하면 다른 제안을 쉽게 참조할 수 있습니다."
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:94
msgid "**title** (Required) The title of the proposal in plain language."
@@ -4014,33 +4064,35 @@ msgstr "**제목** (필수) 제안서의 제목을 평이한 언어로 입력합
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:96
msgid ""
-"**status** (Required) The current status of the proposal. See "
-"[workflow](#workflow) for the possible states."
-msgstr "**상태** (필수) 제안의 현재 상태입니다. 가능한 상태는 [워크플로](#워크플로)"
+"**status** (Required) The current status of the proposal. See [workflow]"
+"(#workflow) for the possible states."
+msgstr ""
+"**상태** (필수) 제안의 현재 상태입니다. 가능한 상태는 [워크플로](#워크플로)"
"를 참조하세요."
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:98
msgid ""
-"**authors** (Required) A list of authors of the proposal. This is simply "
-"the GitHub ID."
+"**authors** (Required) A list of authors of the proposal. This is simply the "
+"GitHub ID."
msgstr "**저자** (필수) 제안서의 작성자 목록입니다. 간단히 GitHub ID입니다."
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:100
msgid ""
-"**creation-date** (Required) The date that the proposal was first "
-"submitted in a PR."
+"**creation-date** (Required) The date that the proposal was first submitted "
+"in a PR."
msgstr "**생성 날짜** (필수) PR에서 제안서를 처음 제출한 날짜입니다."
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:102
msgid ""
"**last-updated** (Optional) The date that the proposal was last changed "
"significantly."
-msgstr "**마지막 업데이트** (선택 사항) 제안서가 마지막으로 크게 변경된 날짜입니다."
+msgstr ""
+"**마지막 업데이트** (선택 사항) 제안서가 마지막으로 크게 변경된 날짜입니다."
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:104
msgid ""
-"**see-also** (Optional) A list of other proposals that are relevant to "
-"this one."
+"**see-also** (Optional) A list of other proposals that are relevant to this "
+"one."
msgstr "**함께 보기** (선택 사항) 이 제안과 관련된 다른 제안 목록입니다."
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:106
@@ -4048,7 +4100,8 @@ msgid "**replaces** (Optional) A list of proposals that this one replaces."
msgstr "**대체** (선택 사항) 이 제안이 대체하는 제안 목록입니다."
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:108
-msgid "**superseded-by** (Optional) A list of proposals that this one supersedes."
+msgid ""
+"**superseded-by** (Optional) A list of proposals that this one supersedes."
msgstr "**대체됨** (선택 사항) 이 제안이 대체하는 제안의 목록입니다."
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:111
@@ -4058,54 +4111,55 @@ msgstr "워크플로우"
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:113
msgid ""
"The idea forming the enhancement should already have been discussed or "
-"pitched in the community. As such, it needs a champion, usually the "
-"author, who shepherds the enhancement. This person also has to find "
-"committers to Flower willing to review the proposal."
+"pitched in the community. As such, it needs a champion, usually the author, "
+"who shepherds the enhancement. This person also has to find committers to "
+"Flower willing to review the proposal."
msgstr ""
-"개선 사항을 구성하는 아이디어는 이미 커뮤니티에서 논의되었거나 제안된 적이 "
-"있어야 합니다. 따라서 개선 사항을 주도하는 사(보통 작성자)이 필요합니다. 이 "
-"사람은 또한 제안을 검토할 의향이 있는 Flower 커미터를 찾아야 합니다."
+"개선 사항을 구성하는 아이디어는 이미 커뮤니티에서 논의되었거나 제안된 적이 있"
+"어야 합니다. 따라서 개선 사항을 주도하는 사(보통 작성자)이 필요합니다. 이 사"
+"람은 또한 제안을 검토할 의향이 있는 Flower 커미터를 찾아야 합니다."
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:115
msgid ""
"New enhancements are checked in with a file name in the form of `NNNN-"
-"YYYYMMDD-enhancement-title.md`, with `NNNN` being the Flower Enhancement "
-"Doc number, to `enhancements`. All enhancements start in `provisional` "
-"state as part of a pull request. Discussions are done as part of the pull"
-" request review."
+"YYYYMMDD-enhancement-title.md`, with `NNNN` being the Flower Enhancement Doc "
+"number, to `enhancements`. All enhancements start in `provisional` state as "
+"part of a pull request. Discussions are done as part of the pull request "
+"review."
msgstr ""
-"새 개선 사항은 `NNNN-YYYYMMDD-enhancement-title.md` 형식의 파일 이름으로 "
-"체크인되며, `NNNN`은 Flower 개선 문서 번호이고 `enhancements`에 해당합니다. "
-"모든 개선 사항은 pull request의 일부로 `잠정` 상태에서 시작됩니다. 토론은 "
-"pull request 검토의 일부로 이루어집니다."
+"새 개선 사항은 `NNNN-YYYYMMDD-enhancement-title.md` 형식의 파일 이름으로 체크"
+"인되며, `NNNN`은 Flower 개선 문서 번호이고 `enhancements`에 해당합니다. 모든 "
+"개선 사항은 pull request의 일부로 `잠정` 상태에서 시작됩니다. 토론은 pull "
+"request 검토의 일부로 이루어집니다."
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:117
msgid ""
-"Once an enhancement has been reviewed and approved, its status is changed"
-" to `implementable`. The actual implementation is then done in separate "
-"pull requests. These pull requests should mention the respective "
-"enhancement as part of their description. After the implementation is "
-"done, the proposal status is changed to `implemented`."
+"Once an enhancement has been reviewed and approved, its status is changed to "
+"`implementable`. The actual implementation is then done in separate pull "
+"requests. These pull requests should mention the respective enhancement as "
+"part of their description. After the implementation is done, the proposal "
+"status is changed to `implemented`."
msgstr ""
-"개선 사항이 검토 및 승인되면 상태가 '구현 가능'으로 변경됩니다. 그런 다음 "
-"실제 구현은 별도의 pull requests를 통해 이루어집니다. 이러한 pull requests는 "
-"설명의 일부로 해당 개선 사항을 언급해야 합니다. 구현이 완료되면 제안 상태는 "
-"'구현됨'으로 변경됩니다."
+"개선 사항이 검토 및 승인되면 상태가 '구현 가능'으로 변경됩니다. 그런 다음 실"
+"제 구현은 별도의 pull requests를 통해 이루어집니다. 이러한 pull requests는 설"
+"명의 일부로 해당 개선 사항을 언급해야 합니다. 구현이 완료되면 제안 상태는 '구"
+"현됨'으로 변경됩니다."
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:119
msgid ""
-"Under certain conditions, other states are possible. An Enhancement has "
-"the following states:"
-msgstr "특정 조건에서는 다른 상태도 가능합니다. 개선에는 다음과 같은 상태가 있습니다:"
+"Under certain conditions, other states are possible. An Enhancement has the "
+"following states:"
+msgstr ""
+"특정 조건에서는 다른 상태도 가능합니다. 개선에는 다음과 같은 상태가 있습니다:"
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:121
msgid ""
"`provisional`: The enhancement has been proposed and is actively being "
-"defined. This is the starting state while the proposal is being fleshed "
-"out and actively defined and discussed."
+"defined. This is the starting state while the proposal is being fleshed out "
+"and actively defined and discussed."
msgstr ""
-"'잠정적': 개선 사항이 제안되어 활발히 정의되고 있습니다. 제안이 구체화되고 "
-"활발하게 정의 및 논의되는 동안의 시작 단계입니다."
+"'잠정적': 개선 사항이 제안되어 활발히 정의되고 있습니다. 제안이 구체화되고 활"
+"발하게 정의 및 논의되는 동안의 시작 단계입니다."
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:122
msgid "`implementable`: The enhancement has been reviewed and approved."
@@ -4118,15 +4172,17 @@ msgid ""
msgstr "`구현됨`: 개선 사항이 구현되었으며 더 이상 활발히 변경되지 않습니다."
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:124
-msgid "`deferred`: The enhancement is proposed but not actively being worked on."
+msgid ""
+"`deferred`: The enhancement is proposed but not actively being worked on."
msgstr "'지연됨': 개선 사항이 제안되었지만 아직 활발히 작업 중이 아닙니다."
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:125
msgid ""
-"`rejected`: The authors and reviewers have decided that this enhancement "
-"is not moving forward."
-msgstr "`거부됨`: 작성자와 검토자는 이 개선 사항을 더 이상 진행하지 않기로 "
-"결정했습니다."
+"`rejected`: The authors and reviewers have decided that this enhancement is "
+"not moving forward."
+msgstr ""
+"`거부됨`: 작성자와 검토자는 이 개선 사항을 더 이상 진행하지 않기로 결정했습니"
+"다."
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:126
msgid "`withdrawn`: The authors have withdrawn the enhancement."
@@ -4138,21 +4194,21 @@ msgstr "'대체됨': 개선 사항이 새로운 개선 사항으로 대체되었
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:131
msgid ""
-"Adding an additional process to the ones already provided by GitHub "
-"(Issues and Pull Requests) adds more complexity and can be a barrier for "
-"potential first-time contributors."
+"Adding an additional process to the ones already provided by GitHub (Issues "
+"and Pull Requests) adds more complexity and can be a barrier for potential "
+"first-time contributors."
msgstr ""
-"GitHub에서 이미 제공하는 프로세스(이슈 및 Pull Requests)에 추가 프로세스를 "
-"추가하면 더 복잡해지고 잠재적인 처음인 기여자에게는 장벽이 될 수 있습니다."
+"GitHub에서 이미 제공하는 프로세스(이슈 및 Pull Requests)에 추가 프로세스를 추"
+"가하면 더 복잡해지고 잠재적인 처음인 기여자에게는 장벽이 될 수 있습니다."
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:133
msgid ""
"Expanding the proposal template beyond the single-sentence description "
-"currently required in the features issue template may be a heavy burden "
-"for non-native English speakers."
+"currently required in the features issue template may be a heavy burden for "
+"non-native English speakers."
msgstr ""
-"현재 기능 이슈 템플릿에서 요구되는 한 문장 설명 이상으로 제안서 템플릿을 "
-"확장하는 것은 영어가 모국어가 아닌 사용자에게는 큰 부담이 될 수 있습니다."
+"현재 기능 이슈 템플릿에서 요구되는 한 문장 설명 이상으로 제안서 템플릿을 확장"
+"하는 것은 영어가 모국어가 아닌 사용자에게는 큰 부담이 될 수 있습니다."
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:137
msgid "GitHub Issues"
@@ -4161,19 +4217,19 @@ msgstr "GitHub 이슈"
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:139
msgid ""
"Using GitHub Issues for these kinds of enhancements is doable. One could "
-"use, for example, tags, to differentiate and filter them from other "
-"issues. The main issue is in discussing and reviewing an enhancement: "
-"GitHub issues only have a single thread for comments. Enhancements "
-"usually have multiple threads of discussion at the same time for various "
-"parts of the doc. Managing these multiple discussions can be confusing "
-"when using GitHub Issues."
-msgstr ""
-"이러한 종류의 개선을 위해 GitHub 이슈를 사용하면 가능합니다. 예를 들어 "
-"태그를 사용하여 다른 이슈와 구별하고 필터링할 수 있습니다. 주요 이슈는 개선 "
-"사항에 대해 토론하고 검토하는 것입니다: GitHub 이슈에는 댓글 스레드가 하나만 "
-"있습니다. 개선 사항에는 일반적으로 문서의 여러 부분에 대해 동시에 여러 개의 "
-"토론 스레드가 있습니다. GitHub 이슈를 사용할 때 이러한 여러 토론을 관리하면 "
-"혼란스러울 수 있습니다."
+"use, for example, tags, to differentiate and filter them from other issues. "
+"The main issue is in discussing and reviewing an enhancement: GitHub issues "
+"only have a single thread for comments. Enhancements usually have multiple "
+"threads of discussion at the same time for various parts of the doc. "
+"Managing these multiple discussions can be confusing when using GitHub "
+"Issues."
+msgstr ""
+"이러한 종류의 개선을 위해 GitHub 이슈를 사용하면 가능합니다. 예를 들어 태그"
+"를 사용하여 다른 이슈와 구별하고 필터링할 수 있습니다. 주요 이슈는 개선 사항"
+"에 대해 토론하고 검토하는 것입니다: GitHub 이슈에는 댓글 스레드가 하나만 있습"
+"니다. 개선 사항에는 일반적으로 문서의 여러 부분에 대해 동시에 여러 개의 토론 "
+"스레드가 있습니다. GitHub 이슈를 사용할 때 이러한 여러 토론을 관리하면 혼란스"
+"러울 수 있습니다."
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:141
msgid "Google Docs"
@@ -4181,17 +4237,16 @@ msgstr "Google 문서 도구"
#: ../../source/fed/0001-20220311-flower-enhancement-doc.md:143
msgid ""
-"Google Docs allow for multiple threads of discussions. But as Google Docs"
-" are hosted outside the project, their discoverability by the community "
-"needs to be taken care of. A list of links to all proposals has to be "
-"managed and made available for the community. Compared to shipping "
-"proposals as part of Flower's repository, the potential for missing links"
-" is much higher."
+"Google Docs allow for multiple threads of discussions. But as Google Docs "
+"are hosted outside the project, their discoverability by the community needs "
+"to be taken care of. A list of links to all proposals has to be managed and "
+"made available for the community. Compared to shipping proposals as part of "
+"Flower's repository, the potential for missing links is much higher."
msgstr ""
"Google 문서는 여러 스레드의 토론을 허용합니다. 하지만 Google 문서는 프로젝트 "
-"외부에서 호스팅되므로 커뮤니티에서 검색할 수 있도록 관리해야 합니다. 모든 "
-"제안에 대한 링크 목록을 관리하고 커뮤니티에 제공해야 합니다. Flower 저장소의 "
-"일부로 제안서를 보낼 때와 비교하면 링크가 누락될 가능성이 훨씬 더 높습니다."
+"외부에서 호스팅되므로 커뮤니티에서 검색할 수 있도록 관리해야 합니다. 모든 제"
+"안에 대한 링크 목록을 관리하고 커뮤니티에 제공해야 합니다. Flower 저장소의 일"
+"부로 제안서를 보낼 때와 비교하면 링크가 누락될 가능성이 훨씬 더 높습니다."
#: ../../source/fed/index.md:1
msgid "FED - Flower Enhancement Doc"
@@ -4203,9 +4258,10 @@ msgstr "종합 평가 결과"
#: ../../source/how-to-aggregate-evaluation-results.rst:4
msgid ""
-"The Flower server does not prescribe a way to aggregate evaluation "
-"results, but it enables the user to fully customize result aggregation."
-msgstr "Flower 서버는 평가 결과를 집계하는 방법을 규정하고 있지 않지만 사용자가 결과 "
+"The Flower server does not prescribe a way to aggregate evaluation results, "
+"but it enables the user to fully customize result aggregation."
+msgstr ""
+"Flower 서버는 평가 결과를 집계하는 방법을 규정하고 있지 않지만 사용자가 결과 "
"집계를 완전히 사용자 지정할 수 있습니다."
#: ../../source/how-to-aggregate-evaluation-results.rst:8
@@ -4214,20 +4270,21 @@ msgstr "사용자 지정 평가 결과 집계"
#: ../../source/how-to-aggregate-evaluation-results.rst:10
msgid ""
-"The same :code:`Strategy`-customization approach can be used to aggregate"
-" custom evaluation results coming from individual clients. Clients can "
-"return custom metrics to the server by returning a dictionary:"
+"The same :code:`Strategy`-customization approach can be used to aggregate "
+"custom evaluation results coming from individual clients. Clients can return "
+"custom metrics to the server by returning a dictionary:"
msgstr ""
-"동일한 :code:`Strategy`-사용자 지정 방식을 사용하여 개별 클라이언트로부터 "
-"오는 사용자 지정 평가 결과를 집계할 수 있습니다. 클라이언트는 dictionary를 "
-"반환하여 사용자 지정 지표를 서버에 반환할 수 있습니다:"
+"동일한 :code:`Strategy`-사용자 지정 방식을 사용하여 개별 클라이언트로부터 오"
+"는 사용자 지정 평가 결과를 집계할 수 있습니다. 클라이언트는 dictionary를 반환"
+"하여 사용자 지정 지표를 서버에 반환할 수 있습니다:"
#: ../../source/how-to-aggregate-evaluation-results.rst:36
msgid ""
"The server can then use a customized strategy to aggregate the metrics "
"provided in these dictionaries:"
-msgstr "그런 다음 서버는 사용자 지정 전략을 사용하여 이러한 dictionaries에서 "
-"제공하는 메트릭을 집계할 수 있습니다:"
+msgstr ""
+"그런 다음 서버는 사용자 지정 전략을 사용하여 이러한 dictionaries에서 제공하"
+"는 메트릭을 집계할 수 있습니다:"
#: ../../source/how-to-authenticate-supernodes.rst:2
msgid "Authenticate SuperNodes"
@@ -4235,13 +4292,12 @@ msgstr "SuperNodes 인증하기"
#: ../../source/how-to-authenticate-supernodes.rst:4
msgid ""
-"Flower has built-in support for authenticated SuperNodes that you can use"
-" to verify the identities of each SuperNode connecting to a SuperLink. "
-"Flower node authentication works similar to how GitHub SSH authentication"
-" works:"
+"Flower has built-in support for authenticated SuperNodes that you can use to "
+"verify the identities of each SuperNode connecting to a SuperLink. Flower "
+"node authentication works similar to how GitHub SSH authentication works:"
msgstr ""
-"Flower는 SuperLink에 연결하는 각 SuperNodes의 신원을 확인하는 데 사용할 수 "
-"있는 인증된 SuperNodes에 대한 기본 지원을 제공합니다. Flower 노드 인증은 "
+"Flower는 SuperLink에 연결하는 각 SuperNodes의 신원을 확인하는 데 사용할 수 있"
+"는 인증된 SuperNodes에 대한 기본 지원을 제공합니다. Flower 노드 인증은 "
"GitHub SSH 인증 방식과 유사하게 작동합니다:"
#: ../../source/how-to-authenticate-supernodes.rst:7
@@ -4250,16 +4306,17 @@ msgstr "SuperLink(서버)는 알려진 (클라이언트) 노드 공개키 목록
#: ../../source/how-to-authenticate-supernodes.rst:8
msgid ""
-"Using ECDH, both SuperNode and SuperLink independently derive a shared "
-"secret"
-msgstr "SuperNode와 SuperLink는 ECDH를 사용하여 독립적으로 공유된 비밀을 도출합니다"
+"Using ECDH, both SuperNode and SuperLink independently derive a shared secret"
+msgstr ""
+"SuperNode와 SuperLink는 ECDH를 사용하여 독립적으로 공유된 비밀을 도출합니다"
#: ../../source/how-to-authenticate-supernodes.rst:9
msgid ""
"Shared secret is used to compute the HMAC value of the message sent from "
"SuperNode to SuperLink as a token"
-msgstr "비밀 공유는 SuperNode에서 SuperLink로 토큰으로 전송된 메시지의 HMAC 값을 "
-"계산하는 데 사용됩니다"
+msgstr ""
+"비밀 공유는 SuperNode에서 SuperLink로 토큰으로 전송된 메시지의 HMAC 값을 계산"
+"하는 데 사용됩니다"
#: ../../source/how-to-authenticate-supernodes.rst:10
msgid "SuperLink verifies the token"
@@ -4267,27 +4324,28 @@ msgstr "SuperLink가 토큰을 확인합니다"
#: ../../source/how-to-authenticate-supernodes.rst:12
msgid ""
-"We recommend you to check out the complete `code example "
-"`_ demonstrating federated learning with Flower in an "
-"authenticated setting."
+"We recommend you to check out the complete `code example `_ demonstrating "
+"federated learning with Flower in an authenticated setting."
msgstr ""
-"인증된 환경에서 Flower로 federated 학습을 시연하는 전체 '코드 예제 "
-"`"
-"_를 확인하는 것이 좋습니다."
+"인증된 환경에서 Flower로 연합 학습을 시연하는 전체 '코드 예제 `_를 확인하는 것이 "
+"좋습니다."
#: ../../source/how-to-authenticate-supernodes.rst:15
msgid ""
-"This guide covers a preview feature that might change in future versions "
-"of Flower."
-msgstr "이 가이드에서는 향후 버전의 Flower에서 변경될 수 있는 미리보기 기능에 대해 "
-"설명합니다."
+"This guide covers a preview feature that might change in future versions of "
+"Flower."
+msgstr ""
+"이 가이드에서는 향후 버전의 Flower에서 변경될 수 있는 미리보기 기능에 대해 설"
+"명합니다."
#: ../../source/how-to-authenticate-supernodes.rst:18
msgid ""
-"For increased security, node authentication can only be used when "
-"encrypted connections (SSL/TLS) are enabled."
-msgstr "보안을 강화하기 위해 노드 인증은 암호화된 연결(SSL/TLS)을 사용하도록 설정한 "
+"For increased security, node authentication can only be used when encrypted "
+"connections (SSL/TLS) are enabled."
+msgstr ""
+"보안을 강화하기 위해 노드 인증은 암호화된 연결(SSL/TLS)을 사용하도록 설정한 "
"경우에만 사용할 수 있습니다."
#: ../../source/how-to-authenticate-supernodes.rst:21
@@ -4297,20 +4355,19 @@ msgstr ":code:`SuperLink`에서 노드 인증 활성화"
#: ../../source/how-to-authenticate-supernodes.rst:23
msgid ""
"To enable node authentication, first you need to configure SSL/TLS "
-"connections to secure the SuperLink<>SuperNode communication. You can "
-"find the complete guide `here `_. After configuring secure connections, you"
-" can enable client authentication in a long-running Flower "
-":code:`SuperLink`. Use the following terminal command to start a Flower "
-":code:`SuperNode` that has both secure connections and node "
-"authentication enabled:"
+"connections to secure the SuperLink<>SuperNode communication. You can find "
+"the complete guide `here `_. After configuring secure connections, you can enable "
+"client authentication in a long-running Flower :code:`SuperLink`. Use the "
+"following terminal command to start a Flower :code:`SuperNode` that has both "
+"secure connections and node authentication enabled:"
msgstr ""
"노드 인증을 활성화하려면 먼저 SuperLink<>SuperNode 통신을 보호하기 위해 SSL/"
"TLS 연결을 구성해야 합니다. 전체 가이드는 `여기 `_에서 확인할 수 있습니다. 보안 "
-"연결을 구성한 후, 장기 실행하는 Flower :code:`SuperLink`에서 클라이언트 "
-"인증을 활성화할 수 있습니다. 다음 터미널 명령을 사용하여 보안 연결과 노드 "
-"인증이 모두 활성화된 Flower :code:`SuperNode`를 시작하세요:"
+"연결을 구성한 후, 장기 실행하는 Flower :code:`SuperLink`에서 클라이언트 인증"
+"을 활성화할 수 있습니다. 다음 터미널 명령을 사용하여 보안 연결과 노드 인증이 "
+"모두 활성화된 Flower :code:`SuperNode`를 시작하세요:"
#: ../../source/how-to-authenticate-supernodes.rst:38
msgid "Let's break down the authentication flags:"
@@ -4318,51 +4375,51 @@ msgstr "인증 플래그를 세분화해 보겠습니다:"
#: ../../source/how-to-authenticate-supernodes.rst:40
msgid ""
-"The first flag :code:`--auth-list-public-keys` expects a path to a CSV "
-"file storing all known node public keys. You need to store all known node"
-" public keys that are allowed to participate in a federation in one CSV "
-"file (:code:`.csv`)."
+"The first flag :code:`--auth-list-public-keys` expects a path to a CSV file "
+"storing all known node public keys. You need to store all known node public "
+"keys that are allowed to participate in a federation in one CSV file (:code:"
+"`.csv`)."
msgstr ""
-"첫 번째 플래그 :code:`--auth-list-public-keys`는 알려진 모든 노드 공개키를 "
-"저장하는 CSV 파일의 경로를 기대합니다. federation에 참여하도록 허용된 모든 "
-"알려진 노드 공개 키를 하나의 CSV 파일(:code:`.csv`)에 저장해야 합니다."
+"첫 번째 플래그 :code:`--auth-list-public-keys`는 알려진 모든 노드 공개키를 저"
+"장하는 CSV 파일의 경로를 기대합니다. federation에 참여하도록 허용된 모든 알려"
+"진 노드 공개 키를 하나의 CSV 파일(:code:`.csv`)에 저장해야 합니다."
#: ../../source/how-to-authenticate-supernodes.rst:42
msgid ""
"A valid CSV file storing known node public keys should list the keys in "
"OpenSSH format, separated by commas and without any comments. For an "
-"example, refer to our code sample, which contains a CSV file with two "
-"known node public keys."
+"example, refer to our code sample, which contains a CSV file with two known "
+"node public keys."
msgstr ""
"알려진 노드 공개키를 저장하는 유효한 CSV 파일은 쉼표로 구분하고 주석 없이 "
-"OpenSSH 형식으로 키를 나열해야 합니다. 예를 들어, 두 개의 알려진 노드 "
-"공개키가 포함된 CSV 파일이 포함된 코드 샘플을 참조하세요."
+"OpenSSH 형식으로 키를 나열해야 합니다. 예를 들어, 두 개의 알려진 노드 공개키"
+"가 포함된 CSV 파일이 포함된 코드 샘플을 참조하세요."
#: ../../source/how-to-authenticate-supernodes.rst:44
msgid ""
-"The second and third flags :code:`--auth-superlink-private-key` and :code"
-":`--auth-superlink-public-key` expect paths to the server's private and "
-"public keys. For development purposes, you can generate a private and "
-"public key pair using :code:`ssh-keygen -t ecdsa -b 384`."
+"The second and third flags :code:`--auth-superlink-private-key` and :code:`--"
+"auth-superlink-public-key` expect paths to the server's private and public "
+"keys. For development purposes, you can generate a private and public key "
+"pair using :code:`ssh-keygen -t ecdsa -b 384`."
msgstr ""
-"두 번째 및 세 번째 플래그 :code:`--auth-superlink-private-key` 및 :code"
-":`--auth-superlink-public-key`는 서버의 개인 및 공개 키의 경로를 예상합니다. "
-"개발 목적으로 :code:`ssh-keygen -t ecdsa -b 384`를 사용하여 개인 및 공개 키 "
-"쌍을 생성할 수 있습니다."
+"두 번째 및 세 번째 플래그 :code:`--auth-superlink-private-key` 및 :code:`--"
+"auth-superlink-public-key`는 서버의 개인 및 공개 키의 경로를 예상합니다. 개"
+"발 목적으로 :code:`ssh-keygen -t ecdsa -b 384`를 사용하여 개인 및 공개 키 쌍"
+"을 생성할 수 있습니다."
#: ../../source/how-to-authenticate-supernodes.rst:47
msgid ""
"In Flower 1.9, there is no support for dynamically removing, editing, or "
-"adding known node public keys to the SuperLink. To change the set of "
-"known nodes, you need to shut the server down, edit the CSV file, and "
-"start the server again. Support for dynamically changing the set of known"
-" nodes is on the roadmap to be released in Flower 1.10 (ETA: June)."
+"adding known node public keys to the SuperLink. To change the set of known "
+"nodes, you need to shut the server down, edit the CSV file, and start the "
+"server again. Support for dynamically changing the set of known nodes is on "
+"the roadmap to be released in Flower 1.10 (ETA: June)."
msgstr ""
-"Flower 1.9에서는 알려진 노드 공개키를 SuperLink에 동적으로 제거, 편집 또는 "
-"추가하는 기능이 지원되지 않습니다. 알려진 노드 집합을 변경하려면 서버를 "
-"종료하고 CSV 파일을 편집한 다음 서버를 다시 시작해야 합니다. 알려진 노드 "
-"집합을 동적으로 변경하는 기능은 Flower 1.10(출시 예정일: 6월)에서 로드맵에 "
-"포함되어 있습니다."
+"Flower 1.9에서는 알려진 노드 공개키를 SuperLink에 동적으로 제거, 편집 또는 추"
+"가하는 기능이 지원되지 않습니다. 알려진 노드 집합을 변경하려면 서버를 종료하"
+"고 CSV 파일을 편집한 다음 서버를 다시 시작해야 합니다. 알려진 노드 집합을 동"
+"적으로 변경하는 기능은 Flower 1.10(출시 예정일: 6월)에서 로드맵에 포함되어 있"
+"습니다."
#: ../../source/how-to-authenticate-supernodes.rst:53
msgid "Enable node authentication in :code:`SuperNode`"
@@ -4371,26 +4428,26 @@ msgstr ":code:`SuperNode`에서 노드 인증을 활성화합니다"
#: ../../source/how-to-authenticate-supernodes.rst:55
msgid ""
"Similar to the long-running Flower server (:code:`SuperLink`), you can "
-"easily enable node authentication in the long-running Flower client "
-"(:code:`SuperNode`). Use the following terminal command to start an "
-"authenticated :code:`SuperNode`:"
+"easily enable node authentication in the long-running Flower client (:code:"
+"`SuperNode`). Use the following terminal command to start an authenticated :"
+"code:`SuperNode`:"
msgstr ""
"장기 실행 중인 Flower 서버(:code:`SuperLink`)와 마찬가지로, 장기 실행 중인 "
-"Flower 클라이언트(:code:`SuperNode`)에서도 노드 인증을 쉽게 활성화할 수 "
-"있습니다. 다음 터미널 명령을 사용하여 인증된 :code:`SuperNode`를 시작하세요:"
+"Flower 클라이언트(:code:`SuperNode`)에서도 노드 인증을 쉽게 활성화할 수 있습"
+"니다. 다음 터미널 명령을 사용하여 인증된 :code:`SuperNode`를 시작하세요:"
#: ../../source/how-to-authenticate-supernodes.rst:66
msgid ""
-"The :code:`--auth-supernode-private-key` flag expects a path to the "
-"node's private key file and the :code:`--auth-supernode-public-key` flag "
-"expects a path to the node's public key file. For development purposes, "
-"you can generate a private and public key pair using :code:`ssh-keygen -t"
-" ecdsa -b 384`."
+"The :code:`--auth-supernode-private-key` flag expects a path to the node's "
+"private key file and the :code:`--auth-supernode-public-key` flag expects a "
+"path to the node's public key file. For development purposes, you can "
+"generate a private and public key pair using :code:`ssh-keygen -t ecdsa -b "
+"384`."
msgstr ""
-":code:`--auth-supernode-private-key` 플래그는 노드의 개인 키 파일 경로를, "
-":code:`--auth-supernode-public-key` 플래그는 노드의 공개 키 파일 경로를 "
-"예상합니다. 개발 목적으로 :code:`ssh-keygen -t ecdsa -b 384`를 사용하여 개인 "
-"및 공개 키 쌍을 생성할 수 있습니다."
+":code:`--auth-supernode-private-key` 플래그는 노드의 개인 키 파일 경로를, :"
+"code:`--auth-supernode-public-key` 플래그는 노드의 공개 키 파일 경로를 예상합"
+"니다. 개발 목적으로 :code:`ssh-keygen -t ecdsa -b 384`를 사용하여 개인 및 공"
+"개 키 쌍을 생성할 수 있습니다."
#: ../../source/how-to-authenticate-supernodes.rst:70
msgid "Security notice"
@@ -4398,19 +4455,18 @@ msgstr "보안 공지"
#: ../../source/how-to-authenticate-supernodes.rst:72
msgid ""
-"The system's security relies on the credentials of the SuperLink and each"
-" SuperNode. Therefore, it is imperative to safeguard and safely store the"
-" credentials to avoid security risks such as Public Key Infrastructure "
-"(PKI) impersonation attacks. The node authentication mechanism also "
-"involves human interaction, so please ensure that all of the "
-"communication is done in a secure manner, using trusted communication "
-"methods."
+"The system's security relies on the credentials of the SuperLink and each "
+"SuperNode. Therefore, it is imperative to safeguard and safely store the "
+"credentials to avoid security risks such as Public Key Infrastructure (PKI) "
+"impersonation attacks. The node authentication mechanism also involves human "
+"interaction, so please ensure that all of the communication is done in a "
+"secure manner, using trusted communication methods."
msgstr ""
-"시스템의 보안은 SuperLink와 각SuperNode의 자격 증명에 의존합니다. 따라서 "
-"공개키 기반구조(PKI) 사칭 공격과 같은 보안 위험을 피하기 위해 자격 증명을 "
-"보호하고 안전하게 보관하는 것이 필수적입니다. 노드 인증 메커니즘에는 사람의 "
-"상호 작용도 포함되므로 모든 통신이 신뢰할 수 있는 통신 방법을 사용하여 "
-"안전한 방식으로 이루어지도록 하세요."
+"시스템의 보안은 SuperLink와 각SuperNode의 자격 증명에 의존합니다. 따라서 공개"
+"키 기반구조(PKI) 사칭 공격과 같은 보안 위험을 피하기 위해 자격 증명을 보호하"
+"고 안전하게 보관하는 것이 필수적입니다. 노드 인증 메커니즘에는 사람의 상호 작"
+"용도 포함되므로 모든 통신이 신뢰할 수 있는 통신 방법을 사용하여 안전한 방식으"
+"로 이루어지도록 하세요."
#: ../../source/how-to-authenticate-supernodes.rst:77
#: ../../source/how-to-enable-ssl-connections.rst:68
@@ -4421,15 +4477,15 @@ msgstr "결론"
#: ../../source/how-to-authenticate-supernodes.rst:79
msgid ""
-"You should now have learned how to start a long-running Flower server "
-"(:code:`SuperLink`) and client (:code:`SuperNode`) with node "
-"authentication enabled. You should also know the significance of the "
-"private key and store it safely to minimize security risks."
+"You should now have learned how to start a long-running Flower server (:code:"
+"`SuperLink`) and client (:code:`SuperNode`) with node authentication "
+"enabled. You should also know the significance of the private key and store "
+"it safely to minimize security risks."
msgstr ""
-"이제 노드 인증이 활성화된 상태에서 장기간 실행되는 Flower "
-"서버(:code:`SuperLink`)와 클라이언트(:code:`SuperNode`)를 시작하는 방법을 "
-"배웠을 것입니다. 또한 보안 위험을 최소화하기 위해 개인키의 중요성을 알고 "
-"안전하게 보관해야 합니다."
+"이제 노드 인증이 활성화된 상태에서 장기간 실행되는 Flower 서버(:code:"
+"`SuperLink`)와 클라이언트(:code:`SuperNode`)를 시작하는 방법을 배웠을 것입니"
+"다. 또한 보안 위험을 최소화하기 위해 개인키의 중요성을 알고 안전하게 보관해"
+"야 합니다."
#: ../../source/how-to-configure-clients.rst:2
msgid "Configure clients"
@@ -4438,13 +4494,13 @@ msgstr "클라이언트 구성"
#: ../../source/how-to-configure-clients.rst:4
msgid ""
"Along with model parameters, Flower can send configuration values to "
-"clients. Configuration values can be used for various purposes. They are,"
-" for example, a popular way to control client-side hyperparameters from "
-"the server."
+"clients. Configuration values can be used for various purposes. They are, "
+"for example, a popular way to control client-side hyperparameters from the "
+"server."
msgstr ""
-"모델 파라미터와 함께 Flower는 설정 값을 클라이언트에 전송할 수 있습니다. "
-"구성 값은 다양한 용도로 사용할 수 있습니다. 예를 들어 서버에서 클라이언트 측 "
-"하이퍼파라미터를 제어하는 데 널리 사용되는 방법입니다."
+"모델 파라미터와 함께 Flower는 설정 값을 클라이언트에 전송할 수 있습니다. 구"
+"성 값은 다양한 용도로 사용할 수 있습니다. 예를 들어 서버에서 클라이언트 측 하"
+"이퍼파라미터를 제어하는 데 널리 사용되는 방법입니다."
#: ../../source/how-to-configure-clients.rst:7
msgid "Configuration values"
@@ -4452,48 +4508,48 @@ msgstr "구성 값"
#: ../../source/how-to-configure-clients.rst:9
msgid ""
-"Configuration values are represented as a dictionary with ``str`` keys "
-"and values of type ``bool``, ``bytes``, ``double`` (64-bit precision "
-"float), ``int``, or ``str`` (or equivalent types in different languages)."
-" Here is an example of a configuration dictionary in Python:"
+"Configuration values are represented as a dictionary with ``str`` keys and "
+"values of type ``bool``, ``bytes``, ``double`` (64-bit precision float), "
+"``int``, or ``str`` (or equivalent types in different languages). Here is an "
+"example of a configuration dictionary in Python:"
msgstr ""
"구성 값은 ``str`` 키와 ``bool``, ``bytes``, ``double``(64비트 정밀도 정수), "
-"``int`` 또는 ``str``(또는 다른 언어의 동등한 유형) 유형의 값으로 구성된 "
-"사전으로 표현됩니다. 다음은 Python의 구성 사전 예제입니다:"
+"``int`` 또는 ``str``(또는 다른 언어의 동등한 유형) 유형의 값으로 구성된 사전"
+"으로 표현됩니다. 다음은 Python의 구성 사전 예제입니다:"
#: ../../source/how-to-configure-clients.rst:20
msgid ""
"Flower serializes these configuration dictionaries (or *config dict* for "
-"short) to their ProtoBuf representation, transports them to the client "
-"using gRPC, and then deserializes them back to Python dictionaries."
+"short) to their ProtoBuf representation, transports them to the client using "
+"gRPC, and then deserializes them back to Python dictionaries."
msgstr ""
-"Flower는 이러한 구성 dictionaries(또는 줄여서 *config dict*)를 ProtoBuf "
-"표현으로 직렬화하고, gRPC를 사용하여 클라이언트로 전송한 다음 다시 Python "
+"Flower는 이러한 구성 dictionaries(또는 줄여서 *config dict*)를 ProtoBuf 표현"
+"으로 직렬화하고, gRPC를 사용하여 클라이언트로 전송한 다음 다시 Python "
"dictionaries로 역직렬화합니다."
#: ../../source/how-to-configure-clients.rst:24
msgid ""
-"Currently, there is no support for directly sending collection types "
-"(e.g., ``Set``, ``List``, ``Map``) as values in configuration "
-"dictionaries. There are several workarounds to send collections as values"
-" by converting them to one of the supported value types (and converting "
-"them back on the client-side)."
+"Currently, there is no support for directly sending collection types (e.g., "
+"``Set``, ``List``, ``Map``) as values in configuration dictionaries. There "
+"are several workarounds to send collections as values by converting them to "
+"one of the supported value types (and converting them back on the client-"
+"side)."
msgstr ""
"현재 구성 사전에서 컬렉션 유형(예: ``Set``, ``List``, ``Map``)을 값으로 직접 "
-"전송하는 기능은 지원되지 않습니다. 컬렉션을 지원되는 값 유형 중 하나로 "
-"변환한 다음 클라이언트 측에서 다시 변환하여 값으로 보내는 몇 가지 해결 "
-"방법이 있습니다."
+"전송하는 기능은 지원되지 않습니다. 컬렉션을 지원되는 값 유형 중 하나로 변환"
+"한 다음 클라이언트 측에서 다시 변환하여 값으로 보내는 몇 가지 해결 방법이 있"
+"습니다."
#: ../../source/how-to-configure-clients.rst:26
msgid ""
"One can, for example, convert a list of floating-point numbers to a JSON "
-"string, then send the JSON string using the configuration dictionary, and"
-" then convert the JSON string back to a list of floating-point numbers on"
-" the client."
+"string, then send the JSON string using the configuration dictionary, and "
+"then convert the JSON string back to a list of floating-point numbers on the "
+"client."
msgstr ""
-"예를 들어 부동 소수점 숫자 목록을 JSON 문자열로 변환한 다음 구성 "
-"dictionary을 사용하여 JSON 문자열을 전송한 다음 클라이언트에서 다시 부동 "
-"소수점 숫자 목록으로 변환할 수 있습니다."
+"예를 들어 부동 소수점 숫자 목록을 JSON 문자열로 변환한 다음 구성 dictionary"
+"을 사용하여 JSON 문자열을 전송한 다음 클라이언트에서 다시 부동 소수점 숫자 목"
+"록으로 변환할 수 있습니다."
#: ../../source/how-to-configure-clients.rst:30
msgid "Configuration through built-in strategies"
@@ -4501,68 +4557,68 @@ msgstr "기본 제공 전략을 통한 구성"
#: ../../source/how-to-configure-clients.rst:32
msgid ""
-"The easiest way to send configuration values to clients is to use a "
-"built-in strategy like :code:`FedAvg`. Built-in strategies support so-"
-"called configuration functions. A configuration function is a function "
-"that the built-in strategy calls to get the configuration dictionary for "
-"the current round. It then forwards the configuration dictionary to all "
-"the clients selected during that round."
+"The easiest way to send configuration values to clients is to use a built-in "
+"strategy like :code:`FedAvg`. Built-in strategies support so-called "
+"configuration functions. A configuration function is a function that the "
+"built-in strategy calls to get the configuration dictionary for the current "
+"round. It then forwards the configuration dictionary to all the clients "
+"selected during that round."
msgstr ""
-"클라이언트에 구성 값을 보내는 가장 쉬운 방법은 :code:`FedAvg`와 같은 기본 "
-"제공 전략을 사용하는 것입니다. 기본 제공 전략은 소위 구성 함수를 지원합니다. "
-"구성 함수는 내장 전략이 현재 단계의 구성 사전을 가져오기 위해 호출하는 "
-"함수입니다. 그런 다음 해당 단계 동안 선택된 모든 클라이언트에 구성 사전을 "
-"전달합니다."
+"클라이언트에 구성 값을 보내는 가장 쉬운 방법은 :code:`FedAvg`와 같은 기본 제"
+"공 전략을 사용하는 것입니다. 기본 제공 전략은 소위 구성 함수를 지원합니다. 구"
+"성 함수는 내장 전략이 현재 단계의 구성 사전을 가져오기 위해 호출하는 함수입니"
+"다. 그런 다음 해당 단계 동안 선택된 모든 클라이언트에 구성 사전을 전달합니다."
#: ../../source/how-to-configure-clients.rst:34
msgid ""
"Let's start with a simple example. Imagine we want to send (a) the batch "
-"size that the client should use, (b) the current global round of "
-"federated learning, and (c) the number of epochs to train on the client-"
-"side. Our configuration function could look like this:"
+"size that the client should use, (b) the current global round of federated "
+"learning, and (c) the number of epochs to train on the client-side. Our "
+"configuration function could look like this:"
msgstr ""
"간단한 예부터 시작하겠습니다. (a) 클라이언트가 사용해야 하는 배치 크기, (b) "
-"현재 글로벌 연합 federated 라운드, (c) 클라이언트 측에서 학습할 에포크 수를 "
-"전송하고 싶다고 가정해 보겠습니다. 구성 함수는 다음과 같습니다:"
+"현재 글로벌 연합 라운드, (c) 클라이언트 측에서 학습할 에포크 수를 전송하고 "
+"싶다고 가정해 보겠습니다. 구성 함수는 다음과 같습니다:"
#: ../../source/how-to-configure-clients.rst:47
msgid ""
"To make the built-in strategies use this function, we can pass it to "
-"``FedAvg`` during initialization using the parameter "
-":code:`on_fit_config_fn`:"
+"``FedAvg`` during initialization using the parameter :code:"
+"`on_fit_config_fn`:"
msgstr ""
-"기본 제공 전략이 이 함수를 사용하도록 하려면 초기화 중에 매개 변수 "
-":code:`on_fit_config_fn`을 사용하여 ``FedAvg``에 이 함수를 전달하면 됩니다:"
+"기본 제공 전략이 이 함수를 사용하도록 하려면 초기화 중에 매개 변수 :code:"
+"`on_fit_config_fn`을 사용하여 ``FedAvg``에 이 함수를 전달하면 됩니다:"
#: ../../source/how-to-configure-clients.rst:56
-msgid "One the client side, we receive the configuration dictionary in ``fit``:"
+msgid ""
+"One the client side, we receive the configuration dictionary in ``fit``:"
msgstr "클라이언트 측에서는 ``fit``으로 구성 dictionary을 받습니다:"
#: ../../source/how-to-configure-clients.rst:67
msgid ""
"There is also an `on_evaluate_config_fn` to configure evaluation, which "
-"works the same way. They are separate functions because one might want to"
-" send different configuration values to `evaluate` (for example, to use a"
-" different batch size)."
+"works the same way. They are separate functions because one might want to "
+"send different configuration values to `evaluate` (for example, to use a "
+"different batch size)."
msgstr ""
"평가를 구성하는 `on_evaluate_config_fn`도 있으며, 같은 방식으로 작동합니다. "
-"다른 배치 크기를 사용하기 위해 다른 구성 값을 `evaluate`로 보내려고 할 수 "
-"있기 때문에 이 함수는 별도의 함수입니다."
+"다른 배치 크기를 사용하기 위해 다른 구성 값을 `evaluate`로 보내려고 할 수 있"
+"기 때문에 이 함수는 별도의 함수입니다."
#: ../../source/how-to-configure-clients.rst:69
msgid ""
-"The built-in strategies call this function every round (that is, every "
-"time `Strategy.configure_fit` or `Strategy.configure_evaluate` runs). "
-"Calling `on_evaluate_config_fn` every round allows us to vary/change the "
-"config dict over consecutive rounds. If we wanted to implement a "
-"hyperparameter schedule, for example, to increase the number of local "
-"epochs during later rounds, we could do the following:"
+"The built-in strategies call this function every round (that is, every time "
+"`Strategy.configure_fit` or `Strategy.configure_evaluate` runs). Calling "
+"`on_evaluate_config_fn` every round allows us to vary/change the config dict "
+"over consecutive rounds. If we wanted to implement a hyperparameter "
+"schedule, for example, to increase the number of local epochs during later "
+"rounds, we could do the following:"
msgstr ""
"기본 제공 전략은 매 라운드마다 이 함수를 호출합니다(즉, `Strategy."
-"configure_fit` 또는 `Strategy.configure_evaluate`가 실행될 때마다). 매 "
-"라운드마다 `on_evaluate_config_fn`을 호출하면 연속된 라운드에서 config "
-"dict를 변경/변경할 수 있습니다. 예를 들어 이후 라운드에서 로컬 에포크 수를 "
-"늘리기 위해 하이퍼파라미터 일정을 구현하려면 다음과 같이 할 수 있습니다:"
+"configure_fit` 또는 `Strategy.configure_evaluate`가 실행될 때마다). 매 라운드"
+"마다 `on_evaluate_config_fn`을 호출하면 연속된 라운드에서 config dict를 변경/"
+"변경할 수 있습니다. 예를 들어 이후 라운드에서 로컬 에포크 수를 늘리기 위해 하"
+"이퍼파라미터 일정을 구현하려면 다음과 같이 할 수 있습니다:"
#: ../../source/how-to-configure-clients.rst:82
msgid "The :code:`FedAvg` strategy will call this function *every round*."
@@ -4576,24 +4632,24 @@ msgstr "개별 클라이언트 구성"
msgid ""
"In some cases, it is necessary to send different configuration values to "
"different clients."
-msgstr "경우에 따라 다른 구성 값을 다른 클라이언트에 보내야 하는 경우도 있습니다."
+msgstr ""
+"경우에 따라 다른 구성 값을 다른 클라이언트에 보내야 하는 경우도 있습니다."
#: ../../source/how-to-configure-clients.rst:89
msgid ""
-"This can be achieved by customizing an existing strategy or by "
-":doc:`implementing a custom strategy from scratch `. Here's a nonsensical example that customizes :code:`FedAvg`"
-" by adding a custom ``\"hello\": \"world\"`` configuration key/value pair"
-" to the config dict of a *single client* (only the first client in the "
-"list, the other clients in this round to not receive this \"special\" "
-"config value):"
+"This can be achieved by customizing an existing strategy or by :doc:"
+"`implementing a custom strategy from scratch `. "
+"Here's a nonsensical example that customizes :code:`FedAvg` by adding a "
+"custom ``\"hello\": \"world\"`` configuration key/value pair to the config "
+"dict of a *single client* (only the first client in the list, the other "
+"clients in this round to not receive this \"special\" config value):"
msgstr ""
"이는 기존 전략을 사용자 지정하거나 :doc:`implementing a custom strategy from "
-"scratch `를 통해 수행할 수 있습니다. 다음은 "
-"사용자 지정 ``\"hello\"'를 추가하여 :code:`FedAvg`를 사용자 지정하는 "
-"무의미한 예입니다: \"world\"`` 구성 키/값 쌍을 *단일 클라이언트*의 config "
-"dict에 추가합니다(목록의 첫 번째 클라이언트만, 이 라운드의 다른 클라이언트는 "
-"이 \"특별한\" 구성 값을 수신하지 않음):"
+"scratch `를 통해 수행할 수 있습니다. 다음은 사용"
+"자 지정 ``\"hello\"'를 추가하여 :code:`FedAvg`를 사용자 지정하는 무의미한 예"
+"입니다: \"world\"`` 구성 키/값 쌍을 *단일 클라이언트*의 config dict에 추가합"
+"니다(목록의 첫 번째 클라이언트만, 이 라운드의 다른 클라이언트는 이 \"특별한"
+"\" 구성 값을 수신하지 않음):"
#: ../../source/how-to-configure-logging.rst:2
msgid "Configure logging"
@@ -4602,22 +4658,22 @@ msgstr "로깅 구성"
#: ../../source/how-to-configure-logging.rst:4
msgid ""
"The Flower logger keeps track of all core events that take place in "
-"federated learning workloads. It presents information by default "
-"following a standard message format:"
+"federated learning workloads. It presents information by default following a "
+"standard message format:"
msgstr ""
-"Flower 로거는 federated 학습 워크로드에서 발생하는 모든 핵심 이벤트를 "
-"추적합니다. 기본적으로 표준 메시지 형식에 따라 정보를 표시합니다:"
+"Flower 로거는 federated 학습 워크로드에서 발생하는 모든 핵심 이벤트를 추적합"
+"니다. 기본적으로 표준 메시지 형식에 따라 정보를 표시합니다:"
#: ../../source/how-to-configure-logging.rst:13
msgid ""
-"containing relevant information including: log message level (e.g. "
-":code:`INFO`, :code:`DEBUG`), a timestamp, the line where the logging "
-"took place from, as well as the log message itself. In this way, the "
-"logger would typically display information on your terminal as follows:"
+"containing relevant information including: log message level (e.g. :code:"
+"`INFO`, :code:`DEBUG`), a timestamp, the line where the logging took place "
+"from, as well as the log message itself. In this way, the logger would "
+"typically display information on your terminal as follows:"
msgstr ""
"로그 메시지 수준(예: :code:`INFO`, :code:`DEBUG`), 타임스탬프, 로깅이 발생한 "
-"줄, 로그 메시지 자체 등 관련 정보를 포함합니다. 이러한 방식으로 로거는 "
-"일반적으로 다음과 같은 정보를 터미널에 표시합니다:"
+"줄, 로그 메시지 자체 등 관련 정보를 포함합니다. 이러한 방식으로 로거는 일반적"
+"으로 다음과 같은 정보를 터미널에 표시합니다:"
#: ../../source/how-to-configure-logging.rst:34
msgid "Saving log to file"
@@ -4627,34 +4683,32 @@ msgstr "파일에 로그 저장"
msgid ""
"By default, the Flower log is outputted to the terminal where you launch "
"your Federated Learning workload from. This applies for both gRPC-based "
-"federation (i.e. when you do :code:`fl.server.start_server`) and when "
-"using the :code:`VirtualClientEngine` (i.e. when you do "
-":code:`fl.simulation.start_simulation`). In some situations you might "
-"want to save this log to disk. You can do so by calling the "
-"`fl.common.logger.configure() "
-"`_"
-" function. For example:"
-msgstr ""
-"기본적으로 Flower 로그는 Federated 학습 워크로드를 실행하는 터미널에 "
-"출력됩니다. 이는 gRPC 기반 페더레이션(즉,:code:`fl.simulation."
-"start_simulation`를 실행하는 경우)과 :code:`VirtualClientEngine`을 사용하는 "
-"경우(즉, :코드:`fl.simulation.start_simulation`을 실행하는 경우) 모두에 "
-"적용됩니다. 경우에 따라 이 로그를 디스크에 저장하고 싶을 수도 있습니다. 이 "
-"경우 `fl.common.logger.configure() `_ 함수를 호출하여 저장할 수 있습니다. 예를 "
-"들어:"
+"federation (i.e. when you do :code:`fl.server.start_server`) and when using "
+"the :code:`VirtualClientEngine` (i.e. when you do :code:`fl.simulation."
+"start_simulation`). In some situations you might want to save this log to "
+"disk. You can do so by calling the `fl.common.logger.configure() `_ function. "
+"For example:"
+msgstr ""
+"기본적으로 Flower 로그는 Federated 학습 워크로드를 실행하는 터미널에 출력됩니"
+"다. 이는 gRPC 기반 페더레이션(즉,:code:`fl.simulation.start_simulation`를 실"
+"행하는 경우)과 :code:`VirtualClientEngine`을 사용하는 경우(즉, :코드:`fl."
+"simulation.start_simulation`을 실행하는 경우) 모두에 적용됩니다. 경우에 따라 "
+"이 로그를 디스크에 저장하고 싶을 수도 있습니다. 이 경우 `fl.common.logger."
+"configure() `_ 함수를 호출하여 저장할 수 있습니다. 예를 들어:"
#: ../../source/how-to-configure-logging.rst:53
msgid ""
-"With the above, Flower will record the log you see on your terminal to "
-":code:`log.txt`. This file will be created in the same directory as were "
-"you are running the code from. If we inspect we see the log above is also"
-" recorded but prefixing with :code:`identifier` each line:"
+"With the above, Flower will record the log you see on your terminal to :code:"
+"`log.txt`. This file will be created in the same directory as were you are "
+"running the code from. If we inspect we see the log above is also recorded "
+"but prefixing with :code:`identifier` each line:"
msgstr ""
-"위와 같이 하면 Flower는 터미널에 표시되는 로그를 :code:`log.txt`에 "
-"기록합니다. 이 파일은 코드를 실행한 디렉터리와 동일한 디렉터리에 생성됩니다. "
-"검사해보면 위의 로그도 기록되지만 각 줄 앞에 :code:`identifier` 접두사가 "
-"붙는 것을 확인할 수 있습니다:"
+"위와 같이 하면 Flower는 터미널에 표시되는 로그를 :code:`log.txt`에 기록합니"
+"다. 이 파일은 코드를 실행한 디렉터리와 동일한 디렉터리에 생성됩니다. 검사해보"
+"면 위의 로그도 기록되지만 각 줄 앞에 :code:`identifier` 접두사가 붙는 것을 확"
+"인할 수 있습니다:"
#: ../../source/how-to-configure-logging.rst:74
msgid "Log your own messages"
@@ -4662,19 +4716,20 @@ msgstr "나만의 메시지 기록"
#: ../../source/how-to-configure-logging.rst:76
msgid ""
-"You might expand the information shown by default with the Flower logger "
-"by adding more messages relevant to your application. You can achieve "
-"this easily as follows."
+"You might expand the information shown by default with the Flower logger by "
+"adding more messages relevant to your application. You can achieve this "
+"easily as follows."
msgstr ""
"애플리케이션과 관련된 메시지를 더 추가하여 Flower 로거에 기본적으로 표시되는 "
"정보를 확장할 수 있습니다. 다음과 같이 쉽게 추가할 수 있습니다."
#: ../../source/how-to-configure-logging.rst:102
msgid ""
-"In this way your logger will show, in addition to the default messages, "
-"the ones introduced by the clients as specified above."
-msgstr "이렇게 하면 로거에 기본 메시지 외에 위에서 지정한 대로 클라이언트가 소개한 "
-"메시지가 표시됩니다."
+"In this way your logger will show, in addition to the default messages, the "
+"ones introduced by the clients as specified above."
+msgstr ""
+"이렇게 하면 로거에 기본 메시지 외에 위에서 지정한 대로 클라이언트가 소개한 메"
+"시지가 표시됩니다."
#: ../../source/how-to-configure-logging.rst:128
msgid "Log to a remote service"
@@ -4682,23 +4737,22 @@ msgstr "원격 서비스에 로그인"
#: ../../source/how-to-configure-logging.rst:130
msgid ""
-"The :code:`fl.common.logger.configure` function, also allows specifying a"
-" host to which logs can be pushed (via :code:`POST`) through a native "
-"Python :code:`logging.handler.HTTPHandler`. This is a particularly useful"
-" feature in :code:`gRPC`-based Federated Learning workloads where "
-"otherwise gathering logs from all entities (i.e. the server and the "
-"clients) might be cumbersome. Note that in Flower simulation, the server "
-"automatically displays all logs. You can still specify a "
-":code:`HTTPHandler` should you wish to backup or analyze the logs "
-"somewhere else."
-msgstr ""
-"또한 :code:`fl.common.logger.configure` 함수를 사용하면 네이티브 Python "
-":code:`logging.handler.HTTPHandler`를 통해 로그를 푸시할 수 있는 호스트를 "
-"지정할 수 있습니다(:code:`POST`를 통해). 이는 모든 엔티티(예: 서버 및 "
-"클라이언트)에서 로그를 수집하는 것이 번거로울 수 있는 :code:`gRPC` 기반 "
-"Federated 학습 워크로드에서 특히 유용한 기능입니다. Flower 시뮬레이션에서는 "
-"서버가 모든 로그를 자동으로 표시합니다. 로그를 다른 곳에 백업하거나 "
-"분석하려는 경우 :code:`HTTPHandler`를 지정할 수 있습니다."
+"The :code:`fl.common.logger.configure` function, also allows specifying a "
+"host to which logs can be pushed (via :code:`POST`) through a native Python :"
+"code:`logging.handler.HTTPHandler`. This is a particularly useful feature "
+"in :code:`gRPC`-based Federated Learning workloads where otherwise gathering "
+"logs from all entities (i.e. the server and the clients) might be "
+"cumbersome. Note that in Flower simulation, the server automatically "
+"displays all logs. You can still specify a :code:`HTTPHandler` should you "
+"wish to backup or analyze the logs somewhere else."
+msgstr ""
+"또한 :code:`fl.common.logger.configure` 함수를 사용하면 네이티브 Python :"
+"code:`logging.handler.HTTPHandler`를 통해 로그를 푸시할 수 있는 호스트를 지정"
+"할 수 있습니다(:code:`POST`를 통해). 이는 모든 엔티티(예: 서버 및 클라이언트)"
+"에서 로그를 수집하는 것이 번거로울 수 있는 :code:`gRPC` 기반 Federated 학습 "
+"워크로드에서 특히 유용한 기능입니다. Flower 시뮬레이션에서는 서버가 모든 로그"
+"를 자동으로 표시합니다. 로그를 다른 곳에 백업하거나 분석하려는 경우 :code:"
+"`HTTPHandler`를 지정할 수 있습니다."
#: ../../source/how-to-enable-ssl-connections.rst:2
msgid "Enable SSL connections"
@@ -4706,33 +4760,32 @@ msgstr "SSL 연결 사용"
#: ../../source/how-to-enable-ssl-connections.rst:4
msgid ""
-"This guide describes how to a SSL-enabled secure Flower server "
-"(:code:`SuperLink`) can be started and how a Flower client "
-"(:code:`SuperNode`) can establish a secure connections to it."
+"This guide describes how to a SSL-enabled secure Flower server (:code:"
+"`SuperLink`) can be started and how a Flower client (:code:`SuperNode`) can "
+"establish a secure connections to it."
msgstr ""
-"이 가이드에서는 SSL을 지원하는 보안 Flower 서버(:코드:`SuperLink`)를 "
-"시작하는 방법과 Flower 클라이언트(:코드:`SuperNode`)가 이 서버에 보안 연결을 "
-"설정하는 방법을 설명합니다."
+"이 가이드에서는 SSL을 지원하는 보안 Flower 서버(:코드:`SuperLink`)를 시작하"
+"는 방법과 Flower 클라이언트(:코드:`SuperNode`)가 이 서버에 보안 연결을 설정하"
+"는 방법을 설명합니다."
#: ../../source/how-to-enable-ssl-connections.rst:7
msgid ""
-"A complete code example demonstrating a secure connection can be found "
-"`here `_."
+"A complete code example demonstrating a secure connection can be found `here "
+"`_."
msgstr ""
"보안 연결을 보여주는 전체 코드 예제는 '여기 `_'에서 확인할 수 있습니다."
#: ../../source/how-to-enable-ssl-connections.rst:10
msgid ""
-"The code example comes with a :code:`README.md` file which explains how "
-"to start it. Although it is already SSL-enabled, it might be less "
-"descriptive on how it does so. Stick to this guide for a deeper "
-"introduction to the topic."
+"The code example comes with a :code:`README.md` file which explains how to "
+"start it. Although it is already SSL-enabled, it might be less descriptive "
+"on how it does so. Stick to this guide for a deeper introduction to the "
+"topic."
msgstr ""
"코드 예제에는 시작 방법을 설명하는 :code:`README.md` 파일이 함께 제공됩니다. "
-"이미 SSL을 사용하도록 설정되어 있지만 그 방법에 대한 설명이 부족할 수 "
-"있습니다. 이 가이드를 참고하여 이 주제에 대해 자세히 알아보세요."
+"이미 SSL을 사용하도록 설정되어 있지만 그 방법에 대한 설명이 부족할 수 있습니"
+"다. 이 가이드를 참고하여 이 주제에 대해 자세히 알아보세요."
#: ../../source/how-to-enable-ssl-connections.rst:16
msgid "Certificates"
@@ -4741,10 +4794,10 @@ msgstr "인증서"
#: ../../source/how-to-enable-ssl-connections.rst:18
msgid ""
"Using SSL-enabled connections requires certificates to be passed to the "
-"server and client. For the purpose of this guide we are going to generate"
-" self-signed certificates. As this can become quite complex we are going "
-"to ask you to run the script in :code:`examples/advanced-"
-"tensorflow/certificates/generate.sh` with the following command sequence:"
+"server and client. For the purpose of this guide we are going to generate "
+"self-signed certificates. As this can become quite complex we are going to "
+"ask you to run the script in :code:`examples/advanced-tensorflow/"
+"certificates/generate.sh` with the following command sequence:"
msgstr ""
"SSL 사용 연결을 사용하려면 서버와 클라이언트에 인증서를 전달해야 합니다. 이 "
"가이드에서는 자체 서명된 인증서를 생성하겠습니다. 이 과정은 상당히 복잡할 수 "
@@ -4753,27 +4806,27 @@ msgstr ""
#: ../../source/how-to-enable-ssl-connections.rst:29
msgid ""
-"This will generate the certificates in :code:`examples/advanced-"
-"tensorflow/.cache/certificates`."
+"This will generate the certificates in :code:`examples/advanced-tensorflow/."
+"cache/certificates`."
msgstr ""
-"이렇게 하면 :code:`examples/advanced-tensorflow/.cache/certificates`에 "
-"인증서가 생성됩니다."
+"이렇게 하면 :code:`examples/advanced-tensorflow/.cache/certificates`에 인증서"
+"가 생성됩니다."
#: ../../source/how-to-enable-ssl-connections.rst:31
msgid ""
-"The approach for generating SSL certificates in the context of this "
-"example can serve as an inspiration and starting point, but it should not"
-" be used as a reference for production environments. Please refer to "
-"other sources regarding the issue of correctly generating certificates "
-"for production environments. For non-critical prototyping or research "
-"projects, it might be sufficient to use the self-signed certificates "
-"generated using the scripts mentioned in this guide."
+"The approach for generating SSL certificates in the context of this example "
+"can serve as an inspiration and starting point, but it should not be used as "
+"a reference for production environments. Please refer to other sources "
+"regarding the issue of correctly generating certificates for production "
+"environments. For non-critical prototyping or research projects, it might be "
+"sufficient to use the self-signed certificates generated using the scripts "
+"mentioned in this guide."
msgstr ""
-"이 예의 맥락에서 SSL 인증서를 생성하는 접근 방식은 영감과 출발점이 될 수 "
-"있지만 프로덕션 환경에 대한 참조로 사용해서는 안 됩니다. 프로덕션 환경용 "
-"인증서를 올바르게 생성하는 문제에 대해서는 다른 출처를 참조하세요. 중요하지 "
-"않은 프로토타이핑 또는 연구 프로젝트의 경우, 이 가이드에 언급된 스크립트를 "
-"사용하여 생성한 자체 서명 인증서를 사용하는 것으로 충분할 수 있습니다."
+"이 예의 맥락에서 SSL 인증서를 생성하는 접근 방식은 영감과 출발점이 될 수 있지"
+"만 프로덕션 환경에 대한 참조로 사용해서는 안 됩니다. 프로덕션 환경용 인증서"
+"를 올바르게 생성하는 문제에 대해서는 다른 출처를 참조하세요. 중요하지 않은 프"
+"로토타이핑 또는 연구 프로젝트의 경우, 이 가이드에 언급된 스크립트를 사용하여 "
+"생성한 자체 서명 인증서를 사용하는 것으로 충분할 수 있습니다."
#: ../../source/how-to-enable-ssl-connections.rst:39
msgid "Server (SuperLink)"
@@ -4781,18 +4834,20 @@ msgstr "서버(SuperLink)"
#: ../../source/how-to-enable-ssl-connections.rst:41
msgid ""
-"Use the following terminal command to start a sever (SuperLink) that uses"
-" the previously generated certificates:"
-msgstr "다음 터미널 명령을 사용하여 이전에 생성한 인증서를 사용하는 서버(SuperLink)"
+"Use the following terminal command to start a sever (SuperLink) that uses "
+"the previously generated certificates:"
+msgstr ""
+"다음 터미널 명령을 사용하여 이전에 생성한 인증서를 사용하는 서버(SuperLink)"
"를 시작합니다:"
#: ../../source/how-to-enable-ssl-connections.rst:50
msgid ""
"When providing certificates, the server expects a tuple of three "
-"certificates paths: CA certificate, server certificate and server private"
-" key."
-msgstr "인증서를 제공할 때 서버는 세 가지 인증서 경로의 튜플을 기대합니다: CA "
-"인증서, 서버 인증서 및 서버 개인 키입니다."
+"certificates paths: CA certificate, server certificate and server private "
+"key."
+msgstr ""
+"인증서를 제공할 때 서버는 세 가지 인증서 경로의 튜플을 기대합니다: CA 인증"
+"서, 서버 인증서 및 서버 개인 키입니다."
#: ../../source/how-to-enable-ssl-connections.rst:54
msgid "Client (SuperNode)"
@@ -4800,23 +4855,25 @@ msgstr "클라이언트(SuperNode)"
#: ../../source/how-to-enable-ssl-connections.rst:56
msgid ""
-"Use the following terminal command to start a client (SuperNode) that "
-"uses the previously generated certificates:"
-msgstr "다음 터미널 명령을 사용하여 이전에 생성한 인증서를 사용하는 "
-"클라이언트(SuperNode)를 시작합니다:"
+"Use the following terminal command to start a client (SuperNode) that uses "
+"the previously generated certificates:"
+msgstr ""
+"다음 터미널 명령을 사용하여 이전에 생성한 인증서를 사용하는 클라이언트"
+"(SuperNode)를 시작합니다:"
#: ../../source/how-to-enable-ssl-connections.rst:64
msgid ""
-"When setting :code:`root_certificates`, the client expects a file path to"
-" PEM-encoded root certificates."
-msgstr "코드:`root_certificates`를 설정하면 클라이언트는 PEM 인코딩된 루트 인증서의 "
+"When setting :code:`root_certificates`, the client expects a file path to "
+"PEM-encoded root certificates."
+msgstr ""
+"코드:`root_certificates`를 설정하면 클라이언트는 PEM 인코딩된 루트 인증서의 "
"파일 경로를 예상합니다."
#: ../../source/how-to-enable-ssl-connections.rst:70
msgid ""
-"You should now have learned how to generate self-signed certificates "
-"using the given script, start an SSL-enabled server and have a client "
-"establish a secure connection to it."
+"You should now have learned how to generate self-signed certificates using "
+"the given script, start an SSL-enabled server and have a client establish a "
+"secure connection to it."
msgstr ""
"이제 주어진 스크립트를 사용하여 자체 서명 인증서를 생성하고, SSL 사용 서버를 "
"시작하고, 클라이언트가 보안 연결을 설정하는 방법을 배웠을 것입니다."
@@ -4827,8 +4884,8 @@ msgstr "추가 리소스"
#: ../../source/how-to-enable-ssl-connections.rst:77
msgid ""
-"These additional sources might be relevant if you would like to dive "
-"deeper into the topic of certificates:"
+"These additional sources might be relevant if you would like to dive deeper "
+"into the topic of certificates:"
msgstr "인증서에 대해 더 자세히 알아보고 싶다면 이러한 추가 자료를 참고하세요:"
#: ../../source/how-to-enable-ssl-connections.rst:79
@@ -4837,7 +4894,7 @@ msgstr "'암호화하세요 `_'"
#: ../../source/how-to-enable-ssl-connections.rst:80
msgid "`certbot `_"
-msgstr "인증봇 `_"
+msgstr "`인증봇 `_"
#: ../../source/how-to-implement-strategies.rst:2
msgid "Implement strategies"
@@ -4845,18 +4902,18 @@ msgstr "전략 구현"
#: ../../source/how-to-implement-strategies.rst:4
msgid ""
-"The strategy abstraction enables implementation of fully custom "
-"strategies. A strategy is basically the federated learning algorithm that"
-" runs on the server. Strategies decide how to sample clients, how to "
-"configure clients for training, how to aggregate updates, and how to "
-"evaluate models. Flower provides a few built-in strategies which are "
-"based on the same API described below."
+"The strategy abstraction enables implementation of fully custom strategies. "
+"A strategy is basically the federated learning algorithm that runs on the "
+"server. Strategies decide how to sample clients, how to configure clients "
+"for training, how to aggregate updates, and how to evaluate models. Flower "
+"provides a few built-in strategies which are based on the same API described "
+"below."
msgstr ""
"전략 추상화를 통해 완전한 맞춤형 전략을 구현할 수 있습니다. 전략은 "
-"기본적으로 서버에서 실행되는 federated 학습 알고리즘입니다. 전략은 "
-"클라이언트를 샘플링하는 방법, 학습을 위해 클라이언트를 구성하는 방법, "
-"업데이트를 집계하는 방법, 모델을 평가하는 방법을 결정합니다. Flower는 아래에 "
-"설명된 것과 동일한 API를 기반으로 하는 몇 가지 기본 제공 전략을 제공합니다."
+"기본적으로 서버에서 실행되는 연합 학습 알고리즘입니다. 전략은 클라이언트를 "
+"샘플링하는 방법, 학습을 위해 클라이언트를 구성하는 방법, 업데이트를 집계하는 "
+"방법, 모델을 평가하는 방법을 결정합니다. Flower는 아래에 설명된 것과 동일한 "
+"API를 기반으로 하는 몇 가지 기본 제공 전략을 제공합니다."
#: ../../source/how-to-implement-strategies.rst:11
msgid "The :code:`Strategy` abstraction"
@@ -4864,15 +4921,14 @@ msgstr ":code:`Strategy` 추상화"
#: ../../source/how-to-implement-strategies.rst:13
msgid ""
-"All strategy implementation are derived from the abstract base class "
-":code:`flwr.server.strategy.Strategy`, both built-in implementations and "
-"third party implementations. This means that custom strategy "
-"implementations have the exact same capabilities at their disposal as "
-"built-in ones."
+"All strategy implementation are derived from the abstract base class :code:"
+"`flwr.server.strategy.Strategy`, both built-in implementations and third "
+"party implementations. This means that custom strategy implementations have "
+"the exact same capabilities at their disposal as built-in ones."
msgstr ""
-"모든 전략 구현은 기본 제공 구현과 타사 구현 모두 추상 기본 클래스인 "
-":code:`flwr.server.strategy.Strategy`에서 파생됩니다. 즉, 사용자 정의 전략 "
-"구현은 기본 제공 구현과 완전히 동일한 기능을 사용할 수 있습니다."
+"모든 전략 구현은 기본 제공 구현과 타사 구현 모두 추상 기본 클래스인 :code:"
+"`flwr.server.strategy.Strategy`에서 파생됩니다. 즉, 사용자 정의 전략 구현은 "
+"기본 제공 구현과 완전히 동일한 기능을 사용할 수 있습니다."
#: ../../source/how-to-implement-strategies.rst:18
msgid ""
@@ -4882,13 +4938,13 @@ msgstr "전략 추상화에서는 구현해야 하는 몇 가지 추상적인
#: ../../source/how-to-implement-strategies.rst:75
msgid ""
-"Creating a new strategy means implementing a new :code:`class` (derived "
-"from the abstract base class :code:`Strategy`) that implements for the "
-"previously shown abstract methods:"
+"Creating a new strategy means implementing a new :code:`class` (derived from "
+"the abstract base class :code:`Strategy`) that implements for the previously "
+"shown abstract methods:"
msgstr ""
-"새 전략을 생성한다는 것은 이전에 표시된 추상 메서드에 대해 구현하는 새로운 "
-":code:`class`(추상 기본 클래스 :code:`Strategy`에서 파생됨)를 구현하는 것을 "
-"의미합니다:"
+"새 전략을 생성한다는 것은 이전에 표시된 추상 메서드에 대해 구현하는 새로운 :"
+"code:`class`(추상 기본 클래스 :code:`Strategy`에서 파생됨)를 구현하는 것을 의"
+"미합니다:"
#: ../../source/how-to-implement-strategies.rst:100
msgid "The Flower server calls these methods in the following order:"
@@ -4904,19 +4960,18 @@ msgstr ":code:`initialize_parameters` 메서드"
#: ../../source/how-to-implement-strategies.rst:182
msgid ""
-":code:`initialize_parameters` is called only once, at the very beginning "
-"of an execution. It is responsible for providing the initial global model"
-" parameters in a serialized form (i.e., as a :code:`Parameters` object)."
+":code:`initialize_parameters` is called only once, at the very beginning of "
+"an execution. It is responsible for providing the initial global model "
+"parameters in a serialized form (i.e., as a :code:`Parameters` object)."
msgstr ""
"code:`initialize_parameters`는 실행을 처음 시작할 때 한 번만 호출됩니다. 이 "
-"함수는 초기 전역 모델 파라미터를 직렬화된 형식(즉, :code:`Parameters` 객체)"
-"으로 제공하는 역할을 합니다."
+"함수는 초기 전역 모델 파라미터를 직렬화된 형식(즉, :code:`Parameters` 객체)으"
+"로 제공하는 역할을 합니다."
#: ../../source/how-to-implement-strategies.rst:184
msgid ""
-"Built-in strategies return user-provided initial parameters. The "
-"following example shows how initial parameters can be passed to "
-":code:`FedAvg`:"
+"Built-in strategies return user-provided initial parameters. The following "
+"example shows how initial parameters can be passed to :code:`FedAvg`:"
msgstr ""
"기본 제공 전략은 사용자가 제공한 초기 매개 변수를 반환합니다. 다음 예는 초기 "
"매개 변수를 :code:`FedAvg`에 전달하는 방법을 보여줍니다:"
@@ -4924,32 +4979,31 @@ msgstr ""
#: ../../source/how-to-implement-strategies.rst:209
msgid ""
"The Flower server will call :code:`initialize_parameters`, which either "
-"returns the parameters that were passed to :code:`initial_parameters`, or"
-" :code:`None`. If no parameters are returned from "
-":code:`initialize_parameters` (i.e., :code:`None`), the server will "
-"randomly select one client and ask it to provide its parameters. This is "
-"a convenience feature and not recommended in practice, but it can be "
-"useful for prototyping. In practice, it is recommended to always use "
-"server-side parameter initialization."
-msgstr ""
-"Flower 서버는 :code:`initialize_parameters`를 호출하여 "
-":code:`initial_parameters`에 전달된 파라미터를 반환하거나 :code:`None`을 "
-"반환합니다. :code:`initial_parameters`에서 반환되는 매개변수가 없는 경우(즉, "
-":code:`None`) 서버는 무작위로 클라이언트 하나를 선택하여 해당 클라이언트에 "
-"매개변수를 제공하도록 요청합니다. 이는 편의 기능이며 실제로는 권장하지 "
-"않지만 프로토타이핑에는 유용할 수 있습니다. 실제로는 항상 서버 측 매개변수 "
-"초기화를 사용하는 것이 좋습니다."
+"returns the parameters that were passed to :code:`initial_parameters`, or :"
+"code:`None`. If no parameters are returned from :code:"
+"`initialize_parameters` (i.e., :code:`None`), the server will randomly "
+"select one client and ask it to provide its parameters. This is a "
+"convenience feature and not recommended in practice, but it can be useful "
+"for prototyping. In practice, it is recommended to always use server-side "
+"parameter initialization."
+msgstr ""
+"Flower 서버는 :code:`initialize_parameters`를 호출하여 :code:"
+"`initial_parameters`에 전달된 파라미터를 반환하거나 :code:`None`을 반환합니"
+"다. :code:`initial_parameters`에서 반환되는 매개변수가 없는 경우(즉, :code:"
+"`None`) 서버는 무작위로 클라이언트 하나를 선택하여 해당 클라이언트에 매개변수"
+"를 제공하도록 요청합니다. 이는 편의 기능이며 실제로는 권장하지 않지만 프로토"
+"타이핑에는 유용할 수 있습니다. 실제로는 항상 서버 측 매개변수 초기화를 사용하"
+"는 것이 좋습니다."
#: ../../source/how-to-implement-strategies.rst:213
msgid ""
"Server-side parameter initialization is a powerful mechanism. It can be "
-"used, for example, to resume training from a previously saved checkpoint."
-" It is also the fundamental capability needed to implement hybrid "
-"approaches, for example, to fine-tune a pre-trained model using federated"
-" learning."
+"used, for example, to resume training from a previously saved checkpoint. It "
+"is also the fundamental capability needed to implement hybrid approaches, "
+"for example, to fine-tune a pre-trained model using federated learning."
msgstr ""
"서버 측 파라미터 초기화는 강력한 메커니즘입니다. 예를 들어 이전에 저장한 "
-"체크포인트에서 학습을 재개하는 데 사용할 수 있습니다. 또한 federated 학습을 "
+"체크포인트에서 학습을 재개하는 데 사용할 수 있습니다. 또한 연합 학습을 "
"사용하여 사전 학습된 모델을 미세 조정하는 등 하이브리드 접근 방식을 구현하는 "
"데 필요한 기본 기능입니다."
@@ -4959,23 +5013,23 @@ msgstr ":code:`configure_fit` 메서드"
#: ../../source/how-to-implement-strategies.rst:218
msgid ""
-":code:`configure_fit` is responsible for configuring the upcoming round "
-"of training. What does *configure* mean in this context? Configuring a "
-"round means selecting clients and deciding what instructions to send to "
-"these clients. The signature of :code:`configure_fit` makes this clear:"
+":code:`configure_fit` is responsible for configuring the upcoming round of "
+"training. What does *configure* mean in this context? Configuring a round "
+"means selecting clients and deciding what instructions to send to these "
+"clients. The signature of :code:`configure_fit` makes this clear:"
msgstr ""
-":code:`configure_fit`은 다가오는 학 라운드를 구성하는 역할을 합니다. 이 "
-"문맥에서 *구성*은 무엇을 의미하나요? 라운드를 구성한다는 것은 클라이언트를 "
-"선택하고 이 클라이언트에게 어떤 지침을 보낼지 결정하는 것을 의미합니다. "
-"code:`configure_fit`의 시그니처를 보면 이를 명확히 알 수 있습니다:"
+":code:`configure_fit`은 다가오는 학 라운드를 구성하는 역할을 합니다. 이 문맥"
+"에서 *구성*은 무엇을 의미하나요? 라운드를 구성한다는 것은 클라이언트를 선택하"
+"고 이 클라이언트에게 어떤 지침을 보낼지 결정하는 것을 의미합니다. code:"
+"`configure_fit`의 시그니처를 보면 이를 명확히 알 수 있습니다:"
#: ../../source/how-to-implement-strategies.rst:231
msgid ""
"The return value is a list of tuples, each representing the instructions "
-"that will be sent to a particular client. Strategy implementations "
-"usually perform the following steps in :code:`configure_fit`:"
+"that will be sent to a particular client. Strategy implementations usually "
+"perform the following steps in :code:`configure_fit`:"
msgstr ""
-"반환 값은 튜플 목록으로, 각 튜플은 특정 클라이언트로 전송될 instruction을 "
+"반환 값은 튜플 목록으로, 각 튜플은 특정 클라이언트로 전송될 명령어를 "
"나타냅니다. 전략 구현은 일반적으로 :code:`configure_fit`에서 다음 단계를 "
"수행합니다:"
@@ -4985,39 +5039,38 @@ msgid ""
"Use the :code:`client_manager` to randomly sample all (or a subset of) "
"available clients (each represented as a :code:`ClientProxy` object)"
msgstr ""
-":code:`client_manager`를 사용하여 사용 가능한 모든 클라이언트(또는 그 하위 "
-"집합)를 무작위로 샘플링합니다(각각 :code:`ClientProxy` 개체로 표시됨)"
+":code:`client_manager`를 사용하여 사용 가능한 모든 클라이언트(또는 그 하위 집"
+"합)를 무작위로 샘플링합니다(각각 :code:`ClientProxy` 개체로 표시됨)"
#: ../../source/how-to-implement-strategies.rst:234
msgid ""
"Pair each :code:`ClientProxy` with the same :code:`FitIns` holding the "
"current global model :code:`parameters` and :code:`config` dict"
msgstr ""
-"각 :code:`ClientProxy`를 현재 글로벌 모델 :code:`parameters` 및 "
-":code:`config` dict를 보유한 동일한 :code:`FitIns`와 쌍을 이룹니다"
+"각 :code:`ClientProxy`를 현재 글로벌 모델 :code:`parameters` 및 :code:"
+"`config` dict를 보유한 동일한 :code:`FitIns`와 쌍을 이룹니다"
#: ../../source/how-to-implement-strategies.rst:236
msgid ""
"More sophisticated implementations can use :code:`configure_fit` to "
-"implement custom client selection logic. A client will only participate "
-"in a round if the corresponding :code:`ClientProxy` is included in the "
-"list returned from :code:`configure_fit`."
+"implement custom client selection logic. A client will only participate in a "
+"round if the corresponding :code:`ClientProxy` is included in the list "
+"returned from :code:`configure_fit`."
msgstr ""
-"보다 정교한 구현은 :code:`configure_fit`을 사용하여 사용자 지정 클라이언트 "
-"선택 로직을 구현할 수 있습니다. 클라이언트는 :code:`configure_fit`에서 "
-"반환된 목록에 해당 :code:`ClientProxy`가 포함된 경우에만 라운드에 참여합니다."
+"보다 정교한 구현은 :code:`configure_fit`을 사용하여 사용자 지정 클라이언트 선"
+"택 로직을 구현할 수 있습니다. 클라이언트는 :code:`configure_fit`에서 반환된 "
+"목록에 해당 :code:`ClientProxy`가 포함된 경우에만 라운드에 참여합니다."
#: ../../source/how-to-implement-strategies.rst:240
msgid ""
"The structure of this return value provides a lot of flexibility to the "
"user. Since instructions are defined on a per-client basis, different "
-"instructions can be sent to each client. This enables custom strategies "
-"to train, for example, different models on different clients, or use "
-"different hyperparameters on different clients (via the :code:`config` "
-"dict)."
+"instructions can be sent to each client. This enables custom strategies to "
+"train, for example, different models on different clients, or use different "
+"hyperparameters on different clients (via the :code:`config` dict)."
msgstr ""
"이 반환 값의 구조는 사용자에게 많은 유연성을 제공합니다. instructions은 "
-"클라이언트별로 정의되므로 각 클라이언트에 서로 다른 instructions을 전송할 수 "
+"클라이언트별로 정의되므로 각 클라이언트에 서로 다른 명령어를 전송할 수 "
"있습니다. 이를 통해 예를 들어 클라이언트마다 다른 모델을 학습시키거나 "
"클라이언트마다 다른 하이퍼파라미터를 사용하는 사용자 지정 전략을 사용할 수 "
"있습니다(:code:`config` dict를 통해)."
@@ -5028,9 +5081,8 @@ msgstr ":code:`aggregate_fit` 메서드"
#: ../../source/how-to-implement-strategies.rst:245
msgid ""
-":code:`aggregate_fit` is responsible for aggregating the results returned"
-" by the clients that were selected and asked to train in "
-":code:`configure_fit`."
+":code:`aggregate_fit` is responsible for aggregating the results returned by "
+"the clients that were selected and asked to train in :code:`configure_fit`."
msgstr ""
"code:`aggregate_fit`은 :code:`configure_fit`에서 훈련하도록 선택되고 요청된 "
"클라이언트가 반환한 결과를 집계하는 역할을 담당합니다."
@@ -5038,26 +5090,26 @@ msgstr ""
#: ../../source/how-to-implement-strategies.rst:258
msgid ""
"Of course, failures can happen, so there is no guarantee that the server "
-"will get results from all the clients it sent instructions to (via "
-":code:`configure_fit`). :code:`aggregate_fit` therefore receives a list "
-"of :code:`results`, but also a list of :code:`failures`."
+"will get results from all the clients it sent instructions to (via :code:"
+"`configure_fit`). :code:`aggregate_fit` therefore receives a list of :code:"
+"`results`, but also a list of :code:`failures`."
msgstr ""
-"물론 실패가 발생할 수 있으므로 서버가 명령을 보낸 모든 클라이언트로부터 "
-"결과를 얻을 수 있다는 보장은 없습니다(:code:`configure_fit`을 통해). 따라서 "
-":code:`aggregate_fit`은 :code:`results` 목록뿐만 아니라 :code:`failures` "
-"목록도 받습니다."
+"물론 실패가 발생할 수 있으므로 서버가 명령을 보낸 모든 클라이언트로부터 결과"
+"를 얻을 수 있다는 보장은 없습니다(:code:`configure_fit`을 통해). 따라서 :"
+"code:`aggregate_fit`은 :code:`results` 목록뿐만 아니라 :code:`failures` 목록"
+"도 받습니다."
#: ../../source/how-to-implement-strategies.rst:260
msgid ""
-":code:`aggregate_fit` returns an optional :code:`Parameters` object and a"
-" dictionary of aggregated metrics. The :code:`Parameters` return value is"
-" optional because :code:`aggregate_fit` might decide that the results "
+":code:`aggregate_fit` returns an optional :code:`Parameters` object and a "
+"dictionary of aggregated metrics. The :code:`Parameters` return value is "
+"optional because :code:`aggregate_fit` might decide that the results "
"provided are not sufficient for aggregation (e.g., too many failures)."
msgstr ""
"code:`aggregate_fit`은 선택적 :code:`Parameters` 개체와 집계된 메트릭의 "
"dictionary를 반환합니다. :code:`Parameters` 반환 값은 :code:`aggregate_fit`"
-"이 제공된 결과가 집계에 충분하지 않다고 판단할 수 있으므로(예: 실패 수가 "
-"너무 많음) 선택 사항입니다."
+"이 제공된 결과가 집계에 충분하지 않다고 판단할 수 있으므로(예: 실패 수가 너"
+"무 많음) 선택 사항입니다."
#: ../../source/how-to-implement-strategies.rst:263
msgid "The :code:`configure_evaluate` method"
@@ -5065,59 +5117,56 @@ msgstr ":code:`configure_evaluate` 메서드"
#: ../../source/how-to-implement-strategies.rst:265
msgid ""
-":code:`configure_evaluate` is responsible for configuring the upcoming "
-"round of evaluation. What does *configure* mean in this context? "
-"Configuring a round means selecting clients and deciding what "
-"instructions to send to these clients. The signature of "
-":code:`configure_evaluate` makes this clear:"
+":code:`configure_evaluate` is responsible for configuring the upcoming round "
+"of evaluation. What does *configure* mean in this context? Configuring a "
+"round means selecting clients and deciding what instructions to send to "
+"these clients. The signature of :code:`configure_evaluate` makes this clear:"
msgstr ""
":code:`configure_evaluate`는 다가오는 평가 라운드를 구성하는 역할을 합니다. "
-"이 문맥에서 *구성*은 무엇을 의미하나요? 라운드를 구성한다는 것은 "
-"클라이언트를 선택하고 이러한 클라이언트에 전송할 지침을 결정하는 것을 "
-"의미합니다. :code:`configure_evaluate`의 시그니처를 보면 이를 명확히 알 수 "
-"있습니다:"
+"이 문맥에서 *구성*은 무엇을 의미하나요? 라운드를 구성한다는 것은 클라이언트"
+"를 선택하고 이러한 클라이언트에 전송할 지침을 결정하는 것을 의미합니다. :"
+"code:`configure_evaluate`의 시그니처를 보면 이를 명확히 알 수 있습니다:"
#: ../../source/how-to-implement-strategies.rst:278
msgid ""
"The return value is a list of tuples, each representing the instructions "
-"that will be sent to a particular client. Strategy implementations "
-"usually perform the following steps in :code:`configure_evaluate`:"
+"that will be sent to a particular client. Strategy implementations usually "
+"perform the following steps in :code:`configure_evaluate`:"
msgstr ""
-"반환 값은 튜플 목록으로, 각 튜플은 특정 클라이언트로 전송될 instructions을 "
+"반환 값은 튜플 목록으로, 각 튜플은 특정 클라이언트로 전송될 명령어를 "
"나타냅니다. 전략 구현은 일반적으로 :code:`configure_evaluate`에서 다음 "
"단계를 수행합니다:"
#: ../../source/how-to-implement-strategies.rst:281
msgid ""
-"Pair each :code:`ClientProxy` with the same :code:`EvaluateIns` holding "
-"the current global model :code:`parameters` and :code:`config` dict"
+"Pair each :code:`ClientProxy` with the same :code:`EvaluateIns` holding the "
+"current global model :code:`parameters` and :code:`config` dict"
msgstr ""
-"각 :code:`ClientProxy`를 현재 글로벌 모델 :code:`parameters` 및 "
-":code:`config` dict를 보유한 동일한 :code:`EvaluateIns`와 쌍을 이룹니다"
+"각 :code:`ClientProxy`를 현재 글로벌 모델 :code:`parameters` 및 :code:"
+"`config` dict를 보유한 동일한 :code:`EvaluateIns`와 쌍을 이룹니다"
#: ../../source/how-to-implement-strategies.rst:283
msgid ""
"More sophisticated implementations can use :code:`configure_evaluate` to "
-"implement custom client selection logic. A client will only participate "
-"in a round if the corresponding :code:`ClientProxy` is included in the "
-"list returned from :code:`configure_evaluate`."
+"implement custom client selection logic. A client will only participate in a "
+"round if the corresponding :code:`ClientProxy` is included in the list "
+"returned from :code:`configure_evaluate`."
msgstr ""
-"보다 정교한 구현은 :code:`configure_evaluate`를 사용하여 사용자 지정 "
-"클라이언트 선택 로직을 구현할 수 있습니다. 클라이언트는 "
-":code:`configure_evaluate`에서 반환된 목록에 해당 :code:`ClientProxy`가 "
-"포함된 경우에만 라운드에 참여합니다."
+"보다 정교한 구현은 :code:`configure_evaluate`를 사용하여 사용자 지정 클라이언"
+"트 선택 로직을 구현할 수 있습니다. 클라이언트는 :code:`configure_evaluate`에"
+"서 반환된 목록에 해당 :code:`ClientProxy`가 포함된 경우에만 라운드에 참여합니"
+"다."
#: ../../source/how-to-implement-strategies.rst:287
msgid ""
"The structure of this return value provides a lot of flexibility to the "
"user. Since instructions are defined on a per-client basis, different "
-"instructions can be sent to each client. This enables custom strategies "
-"to evaluate, for example, different models on different clients, or use "
-"different hyperparameters on different clients (via the :code:`config` "
-"dict)."
+"instructions can be sent to each client. This enables custom strategies to "
+"evaluate, for example, different models on different clients, or use "
+"different hyperparameters on different clients (via the :code:`config` dict)."
msgstr ""
-"이 반환 값의 구조는 사용자에게 많은 유연성을 제공합니다. instructions은 "
-"클라이언트별로 정의되므로 각 클라이언트에 서로 다른 instructions을 전송할 수 "
+"이 반환 값의 구조는 사용자에게 많은 유연성을 제공합니다. 명령어는 "
+"클라이언트별로 정의되므로 각 클라이언트에 서로 다른 명령어를 전송할 수 "
"있습니다. 이를 통해 사용자 지정 전략을 통해 예를 들어 클라이언트마다 다른 "
"모델을 평가하거나 클라이언트마다 다른 하이퍼파라미터를 사용할 수 "
"있습니다(:code:`config` dict를 통해)."
@@ -5129,35 +5178,35 @@ msgstr ":code:`aggregate_evaluate` 메서드"
#: ../../source/how-to-implement-strategies.rst:293
msgid ""
":code:`aggregate_evaluate` is responsible for aggregating the results "
-"returned by the clients that were selected and asked to evaluate in "
-":code:`configure_evaluate`."
+"returned by the clients that were selected and asked to evaluate in :code:"
+"`configure_evaluate`."
msgstr ""
-"code:`aggregate_evaluate`는 :code:`configure_evaluate`에서 선택되어 평가를 "
-"요청한 클라이언트가 반환한 결과를 집계하는 역할을 담당합니다."
+"code:`aggregate_evaluate`는 :code:`configure_evaluate`에서 선택되어 평가를 요"
+"청한 클라이언트가 반환한 결과를 집계하는 역할을 담당합니다."
#: ../../source/how-to-implement-strategies.rst:306
msgid ""
"Of course, failures can happen, so there is no guarantee that the server "
-"will get results from all the clients it sent instructions to (via "
-":code:`configure_evaluate`). :code:`aggregate_evaluate` therefore "
-"receives a list of :code:`results`, but also a list of :code:`failures`."
+"will get results from all the clients it sent instructions to (via :code:"
+"`configure_evaluate`). :code:`aggregate_evaluate` therefore receives a list "
+"of :code:`results`, but also a list of :code:`failures`."
msgstr ""
-"물론 실패가 발생할 수 있으므로 서버가 명령을 보낸 모든 클라이언트로부터 "
-"결과를 얻을 수 있다는 보장은 없습니다(:code:`configure_evaluate`를 통해). "
-"따라서 :code:`aggregate_evaluate`는 :code:`results` 목록뿐만 아니라 "
-":code:`failures` 목록도 받습니다."
+"물론 실패가 발생할 수 있으므로 서버가 명령을 보낸 모든 클라이언트로부터 결과"
+"를 얻을 수 있다는 보장은 없습니다(:code:`configure_evaluate`를 통해). 따라"
+"서 :code:`aggregate_evaluate`는 :code:`results` 목록뿐만 아니라 :code:"
+"`failures` 목록도 받습니다."
#: ../../source/how-to-implement-strategies.rst:308
msgid ""
-":code:`aggregate_evaluate` returns an optional :code:`float` (loss) and a"
-" dictionary of aggregated metrics. The :code:`float` return value is "
-"optional because :code:`aggregate_evaluate` might decide that the results"
-" provided are not sufficient for aggregation (e.g., too many failures)."
+":code:`aggregate_evaluate` returns an optional :code:`float` (loss) and a "
+"dictionary of aggregated metrics. The :code:`float` return value is optional "
+"because :code:`aggregate_evaluate` might decide that the results provided "
+"are not sufficient for aggregation (e.g., too many failures)."
msgstr ""
"code:`aggregate_evaluate`는 선택적 :code:`float`(손실)와 집계된 메트릭의 "
"dictionary를 반환합니다. code:`float` 반환 값은 :code:`aggregate_evaluate`가 "
-"제공된 결과가 집계에 충분하지 않다고 판단할 수 있으므로(예: 실패 수가 너무 "
-"많음) 선택 사항입니다."
+"제공된 결과가 집계에 충분하지 않다고 판단할 수 있으므로(예: 실패 수가 너무 많"
+"음) 선택 사항입니다."
#: ../../source/how-to-implement-strategies.rst:311
msgid "The :code:`evaluate` method"
@@ -5166,26 +5215,25 @@ msgstr ":code:`evaluate` 메서드"
#: ../../source/how-to-implement-strategies.rst:313
msgid ""
":code:`evaluate` is responsible for evaluating model parameters on the "
-"server-side. Having :code:`evaluate` in addition to "
-":code:`configure_evaluate`/:code:`aggregate_evaluate` enables strategies "
-"to perform both servers-side and client-side (federated) evaluation."
+"server-side. Having :code:`evaluate` in addition to :code:"
+"`configure_evaluate`/:code:`aggregate_evaluate` enables strategies to "
+"perform both servers-side and client-side (federated) evaluation."
msgstr ""
":code:`evaluate`는 서버 측에서 모델 매개변수를 평가하는 역할을 담당합니다. "
"code:`configure_evaluate`/:code:`aggregate_evaluate`와 함께 :code:`evaluate`"
-"를 사용하면 서버 측과 클라이언트 측(federated) 평가를 모두 수행할 수 있는 "
-"전략을 사용할 수 있습니다."
+"를 사용하면 서버 측과 클라이언트 측(federated) 평가를 모두 수행할 수 있는 전"
+"략을 사용할 수 있습니다."
#: ../../source/how-to-implement-strategies.rst:323
msgid ""
-"The return value is again optional because the strategy might not need to"
-" implement server-side evaluation or because the user-defined "
-":code:`evaluate` method might not complete successfully (e.g., it might "
-"fail to load the server-side evaluation data)."
+"The return value is again optional because the strategy might not need to "
+"implement server-side evaluation or because the user-defined :code:"
+"`evaluate` method might not complete successfully (e.g., it might fail to "
+"load the server-side evaluation data)."
msgstr ""
-"반환 값은 전략에서 서버 측 평가를 구현할 필요가 없거나 사용자 정의 "
-":code:`evaluate` 메서드가 성공적으로 완료되지 않을 수 있기 때문에(예: 서버 "
-"측 평가 데이터를 로드하지 못할 수 있음) 다시 선택 사항으로 설정할 수 "
-"있습니다."
+"반환 값은 전략에서 서버 측 평가를 구현할 필요가 없거나 사용자 정의 :code:"
+"`evaluate` 메서드가 성공적으로 완료되지 않을 수 있기 때문에(예: 서버 측 평가 "
+"데이터를 로드하지 못할 수 있음) 다시 선택 사항으로 설정할 수 있습니다."
#: ../../source/how-to-install-flower.rst:2
msgid "Install Flower"
@@ -5206,17 +5254,18 @@ msgstr "pip 사용"
#: ../../source/how-to-install-flower.rst:17
msgid ""
-"Stable releases are available on `PyPI "
-"`_::"
-msgstr "안정적인 릴리즈는 `PyPI `_:: 에서 확인할 수 "
+"Stable releases are available on `PyPI `_::"
+msgstr ""
+"안정적인 릴리즈는 `PyPI `_:: 에서 확인할 수 "
"있습니다::"
#: ../../source/how-to-install-flower.rst:21
msgid ""
"For simulations that use the Virtual Client Engine, ``flwr`` should be "
"installed with the ``simulation`` extra::"
-msgstr "가상 클라이언트 엔진을 사용하는 시뮬레이션의 경우 ``flwr``을 ``simulation``"
-"extra와 함께 설치해야 합니다:"
+msgstr ""
+"가상 클라이언트 엔진을 사용하는 시뮬레이션의 경우 ``flwr``을 "
+"``simulation``extra와 함께 설치해야 합니다:"
#: ../../source/how-to-install-flower.rst:27
msgid "Using conda (or mamba)"
@@ -5228,15 +5277,16 @@ msgstr "Flower은 'conda-forge' 채널에서도 설치할 수 있습니다."
#: ../../source/how-to-install-flower.rst:31
msgid ""
-"If you have not added ``conda-forge`` to your channels, you will first "
-"need to run the following::"
+"If you have not added ``conda-forge`` to your channels, you will first need "
+"to run the following::"
msgstr "채널에 'conda-forge'를 추가하지 않은 경우 먼저 다음을 실행해야 합니다:"
#: ../../source/how-to-install-flower.rst:36
msgid ""
-"Once the ``conda-forge`` channel has been enabled, ``flwr`` can be "
-"installed with ``conda``::"
-msgstr "conda-forge`` 채널이 활성화되면 ``flwr``을 ``conda``로 설치할 수 있습니다::"
+"Once the ``conda-forge`` channel has been enabled, ``flwr`` can be installed "
+"with ``conda``::"
+msgstr ""
+"conda-forge`` 채널이 활성화되면 ``flwr``을 ``conda``로 설치할 수 있습니다::"
#: ../../source/how-to-install-flower.rst:40
msgid "or with ``mamba``::"
@@ -5249,11 +5299,11 @@ msgstr "설치 확인"
#: ../../source/how-to-install-flower.rst:48
msgid ""
"The following command can be used to verify if Flower was successfully "
-"installed. If everything worked, it should print the version of Flower to"
-" the command line::"
+"installed. If everything worked, it should print the version of Flower to "
+"the command line::"
msgstr ""
-"다음 명령을 사용하여 Flower가 성공적으로 설치되었는지 확인할 수 있습니다. "
-"모든 것이 정상적으로 작동하면 명령줄에 Flower의 버전이 출력됩니다:"
+"다음 명령을 사용하여 Flower가 성공적으로 설치되었는지 확인할 수 있습니다. 모"
+"든 것이 정상적으로 작동하면 명령줄에 Flower의 버전이 출력됩니다:"
#: ../../source/how-to-install-flower.rst:55
msgid "Advanced installation options"
@@ -5265,7 +5315,8 @@ msgstr "Docker를 통해 설치"
#: ../../source/how-to-install-flower.rst:60
msgid ":doc:`How to run Flower using Docker `"
-msgstr ":doc:`Docker를 사용하여 Flower를 실행하는 방법 `"
#: ../../source/how-to-install-flower.rst:63
@@ -5274,17 +5325,17 @@ msgstr "사전 릴리즈 설치"
#: ../../source/how-to-install-flower.rst:65
msgid ""
-"New (possibly unstable) versions of Flower are sometimes available as "
-"pre-release versions (alpha, beta, release candidate) before the stable "
-"release happens::"
+"New (possibly unstable) versions of Flower are sometimes available as pre-"
+"release versions (alpha, beta, release candidate) before the stable release "
+"happens::"
msgstr ""
-"새(불안정할 수 있는) 버전의 Flower는 안정 버전이 출시되기 전에 사전 릴리즈 "
-"버전(알파, 베타, 릴리즈 후보)으로 제공되는 경우가 있습니다:"
+"새(불안정할 수 있는) 버전의 Flower는 안정 버전이 출시되기 전에 사전 릴리즈 버"
+"전(알파, 베타, 릴리즈 후보)으로 제공되는 경우가 있습니다:"
#: ../../source/how-to-install-flower.rst:69
msgid ""
-"For simulations that use the Virtual Client Engine, ``flwr`` pre-releases"
-" should be installed with the ``simulation`` extra::"
+"For simulations that use the Virtual Client Engine, ``flwr`` pre-releases "
+"should be installed with the ``simulation`` extra::"
msgstr ""
"가상 클라이언트 엔진을 사용하는 시뮬레이션의 경우 ``flwr`` 사전 릴리즈를 "
"``simulation`` extra와 함께 설치해야 합니다:"
@@ -5295,15 +5346,16 @@ msgstr "야간 릴리즈 설치"
#: ../../source/how-to-install-flower.rst:76
msgid ""
-"The latest (potentially unstable) changes in Flower are available as "
-"nightly releases::"
-msgstr "Flower의 최신 (불안정할 수 있는) 변경 사항은 다음과 같이 야간 릴리즈로 "
-"제공됩니다:"
+"The latest (potentially unstable) changes in Flower are available as nightly "
+"releases::"
+msgstr ""
+"Flower의 최신 (불안정할 수 있는) 변경 사항은 다음과 같이 야간 릴리즈로 제공됩"
+"니다:"
#: ../../source/how-to-install-flower.rst:80
msgid ""
-"For simulations that use the Virtual Client Engine, ``flwr-nightly`` "
-"should be installed with the ``simulation`` extra::"
+"For simulations that use the Virtual Client Engine, ``flwr-nightly`` should "
+"be installed with the ``simulation`` extra::"
msgstr ""
"가상 클라이언트 엔진을 사용하는 시뮬레이션의 경우, ``flwr-nightly``를 "
"``simulation`` extr와 함께 설치해야 합니다::"
@@ -5314,24 +5366,24 @@ msgstr "모니터 시뮬레이션"
#: ../../source/how-to-monitor-simulation.rst:4
msgid ""
-"Flower allows you to monitor system resources while running your "
-"simulation. Moreover, the Flower simulation engine is powerful and "
-"enables you to decide how to allocate resources per client manner and "
-"constrain the total usage. Insights from resource consumption can help "
-"you make smarter decisions and speed up the execution time."
+"Flower allows you to monitor system resources while running your simulation. "
+"Moreover, the Flower simulation engine is powerful and enables you to decide "
+"how to allocate resources per client manner and constrain the total usage. "
+"Insights from resource consumption can help you make smarter decisions and "
+"speed up the execution time."
msgstr ""
-"Flower를 사용하면 시뮬레이션을 실행하는 동안 시스템 리소스를 모니터링할 수 "
-"있습니다. 또한 Flower 시뮬레이션 엔진은 강력하며 클라이언트별 리소스 할당 "
-"방법을 결정하고 총 사용량을 제한할 수 있습니다. 리소스 소비에 대한 "
-"인사이트를 통해 더 현명한 결정을 내리고 실행 시간을 단축할 수 있습니다."
+"Flower를 사용하면 시뮬레이션을 실행하는 동안 시스템 리소스를 모니터링할 수 있"
+"습니다. 또한 Flower 시뮬레이션 엔진은 강력하며 클라이언트별 리소스 할당 방법"
+"을 결정하고 총 사용량을 제한할 수 있습니다. 리소스 소비에 대한 인사이트를 통"
+"해 더 현명한 결정을 내리고 실행 시간을 단축할 수 있습니다."
#: ../../source/how-to-monitor-simulation.rst:6
msgid ""
-"The specific instructions assume you are using macOS and have the "
-"`Homebrew `_ package manager installed."
+"The specific instructions assume you are using macOS and have the `Homebrew "
+"`_ package manager installed."
msgstr ""
-"구체적인 지침은 macOS를 사용 중이고 'Homebrew `_ 패키지 "
-"관리자가 설치되어 있다고 가정합니다."
+"구체적인 지침은 macOS를 사용 중이고 'Homebrew `_ 패키지 관"
+"리자가 설치되어 있다고 가정합니다."
#: ../../source/how-to-monitor-simulation.rst:10
msgid "Downloads"
@@ -5339,15 +5391,15 @@ msgstr "다운로드"
#: ../../source/how-to-monitor-simulation.rst:16
msgid ""
-"`Prometheus `_ is used for data collection, while"
-" `Grafana `_ will enable you to visualize the "
-"collected data. They are both well integrated with `Ray "
-"`_ which Flower uses under the hood."
+"`Prometheus `_ is used for data collection, while "
+"`Grafana `_ will enable you to visualize the collected "
+"data. They are both well integrated with `Ray `_ which "
+"Flower uses under the hood."
msgstr ""
"`Prometheus `_는 데이터 수집에 사용되며, `Grafana "
"`_는 수집된 데이터를 시각화할 수 있게 해줍니다. 이 두 "
-"도구는 모두 Flower가 내부적으로 사용하는 `Ray `_와 잘 "
-"통합되어 있습니다."
+"도구는 모두 Flower가 내부적으로 사용하는 `Ray `_와 잘 통"
+"합되어 있습니다."
#: ../../source/how-to-monitor-simulation.rst:18
msgid ""
@@ -5365,25 +5417,25 @@ msgstr "이전 세대 Intel Mac 장치에서는:"
#: ../../source/how-to-monitor-simulation.rst:34
msgid ""
-"Open the respective configuration files and change them. Depending on "
-"your device, use one of the two following commands:"
-msgstr "각 구성 파일을 열고 변경합니다. 장치에 따라 다음 두 명령 중 하나를 "
-"사용합니다:"
+"Open the respective configuration files and change them. Depending on your "
+"device, use one of the two following commands:"
+msgstr ""
+"각 구성 파일을 열고 변경합니다. 장치에 따라 다음 두 명령 중 하나를 사용합니"
+"다:"
#: ../../source/how-to-monitor-simulation.rst:44
msgid ""
-"and then delete all the text in the file and paste a new Prometheus "
-"config you see below. You may adjust the time intervals to your "
-"requirements:"
+"and then delete all the text in the file and paste a new Prometheus config "
+"you see below. You may adjust the time intervals to your requirements:"
msgstr ""
-"를 입력한 다음 파일의 모든 텍스트를 삭제하고 아래에 표시된 새 Prometheus "
-"설정을 붙여넣습니다. 요구 사항에 따라 시간 간격을 조정할 수 있습니다:"
+"를 입력한 다음 파일의 모든 텍스트를 삭제하고 아래에 표시된 새 Prometheus 설정"
+"을 붙여넣습니다. 요구 사항에 따라 시간 간격을 조정할 수 있습니다:"
#: ../../source/how-to-monitor-simulation.rst:59
msgid ""
-"Now after you have edited the Prometheus configuration, do the same with "
-"the Grafana configuration files. Open those using one of the following "
-"commands as before:"
+"Now after you have edited the Prometheus configuration, do the same with the "
+"Grafana configuration files. Open those using one of the following commands "
+"as before:"
msgstr ""
"이제 Prometheus 구성을 편집한 후 Grafana 구성 파일에 대해서도 동일한 작업을 "
"수행합니다. 이전과 마찬가지로 다음 명령 중 하나를 사용하여 파일을 엽니다:"
@@ -5392,14 +5444,16 @@ msgstr ""
msgid ""
"Your terminal editor should open and allow you to apply the following "
"configuration as before."
-msgstr "터미널 편집기가 열리면 이전과 마찬가지로 다음 구성을 적용할 수 있습니다."
+msgstr ""
+"터미널 편집기가 열리면 이전과 마찬가지로 다음 구성을 적용할 수 있습니다."
#: ../../source/how-to-monitor-simulation.rst:84
msgid ""
-"Congratulations, you just downloaded all the necessary software needed "
-"for metrics tracking. Now, let’s start it."
-msgstr "축하합니다. 매트릭 트레킹에 필요한 모든 소프트웨어를 다운로드하셨습니다. "
-"이제 시작해 보겠습니다."
+"Congratulations, you just downloaded all the necessary software needed for "
+"metrics tracking. Now, let’s start it."
+msgstr ""
+"축하합니다. 매트릭 트레킹에 필요한 모든 소프트웨어를 다운로드하셨습니다. 이"
+"제 시작해 보겠습니다."
#: ../../source/how-to-monitor-simulation.rst:88
msgid "Tracking metrics"
@@ -5409,14 +5463,15 @@ msgstr "매트릭 트래킹"
msgid ""
"Before running your Flower simulation, you have to start the monitoring "
"tools you have just installed and configured."
-msgstr "Flower 시뮬레이션을 실행하기 전에 방금 설치 및 구성한 모니터링 도구를 "
-"시작해야 합니다."
+msgstr ""
+"Flower 시뮬레이션을 실행하기 전에 방금 설치 및 구성한 모니터링 도구를 시작해"
+"야 합니다."
#: ../../source/how-to-monitor-simulation.rst:97
msgid ""
-"Please include the following argument in your Python code when starting a"
-" simulation."
-msgstr "시뮬레이션을 시작할 때 Python 코드에 다음 argument를 포함하세요."
+"Please include the following argument in your Python code when starting a "
+"simulation."
+msgstr "시뮬레이션을 시작할 때 Python 코드에 다음 전달인자를 포함하세요."
#: ../../source/how-to-monitor-simulation.rst:108
msgid "Now, you are ready to start your workload."
@@ -5424,9 +5479,10 @@ msgstr "이제 워크로드를 시작할 준비가 되었습니다."
#: ../../source/how-to-monitor-simulation.rst:110
msgid ""
-"Shortly after the simulation starts, you should see the following logs in"
-" your terminal:"
-msgstr "시뮬레이션이 시작되고 얼마 지나지 않아 터미널에 다음 로그가 표시됩니다:"
+"Shortly after the simulation starts, you should see the following logs in "
+"your terminal:"
+msgstr ""
+"시뮬레이션이 시작되고 얼마 지나지 않아 터미널에 다음 로그가 표시됩니다:"
#: ../../source/how-to-monitor-simulation.rst:117
msgid "You can look at everything at ``_ ."
@@ -5434,24 +5490,24 @@ msgstr "``_ 에서 모든 것을 볼 수 있습니다."
#: ../../source/how-to-monitor-simulation.rst:119
msgid ""
-"It's a Ray Dashboard. You can navigate to Metrics (on the left panel, the"
-" lowest option)."
-msgstr "Ray 대시보드입니다. 메트릭(왼쪽 패널의 가장 아래 옵션)으로 이동할 수 "
-"있습니다."
+"It's a Ray Dashboard. You can navigate to Metrics (on the left panel, the "
+"lowest option)."
+msgstr ""
+"Ray 대시보드입니다. 메트릭(왼쪽 패널의 가장 아래 옵션)으로 이동할 수 있습니"
+"다."
#: ../../source/how-to-monitor-simulation.rst:121
msgid ""
-"Or alternatively, you can just see them in Grafana by clicking on the "
-"right-up corner, “View in Grafana”. Please note that the Ray dashboard is"
-" only accessible during the simulation. After the simulation ends, you "
-"can only use Grafana to explore the metrics. You can start Grafana by "
-"going to ``http://localhost:3000/``."
+"Or alternatively, you can just see them in Grafana by clicking on the right-"
+"up corner, “View in Grafana”. Please note that the Ray dashboard is only "
+"accessible during the simulation. After the simulation ends, you can only "
+"use Grafana to explore the metrics. You can start Grafana by going to "
+"``http://localhost:3000/``."
msgstr ""
-"또는 오른쪽 위 모서리인 \"Grafana에서 보기\"를 클릭하여 Grafana에서 바로 "
-"확인할 수도 있습니다. Ray 대시보드는 시뮬레이션 중에만 액세스할 수 있다는 "
-"점에 유의하세요. 시뮬레이션이 종료된 후에는 Grafana를 사용하여 메트릭을 "
-"탐색할 수만 있습니다. ``http://localhost:3000/``로 이동하여 Grafana를 시작할 "
-"수 있습니다."
+"또는 오른쪽 위 모서리인 \"Grafana에서 보기\"를 클릭하여 Grafana에서 바로 확인"
+"할 수도 있습니다. Ray 대시보드는 시뮬레이션 중에만 액세스할 수 있다는 점에 유"
+"의하세요. 시뮬레이션이 종료된 후에는 Grafana를 사용하여 메트릭을 탐색할 수만 "
+"있습니다. ``http://localhost:3000/``로 이동하여 Grafana를 시작할 수 있습니다."
#: ../../source/how-to-monitor-simulation.rst:123
msgid ""
@@ -5468,26 +5524,26 @@ msgstr "리소스 할당"
#: ../../source/how-to-monitor-simulation.rst:134
msgid ""
-"You must understand how the Ray library works to efficiently allocate "
-"system resources to simulation clients on your own."
-msgstr "Ray 라이브러리가 어떻게 작동하는지 이해해야 시뮬레이션 클라이언트에 시스템 "
-"리소스를 효율적으로 할당할 수 있습니다."
+"You must understand how the Ray library works to efficiently allocate system "
+"resources to simulation clients on your own."
+msgstr ""
+"Ray 라이브러리가 어떻게 작동하는지 이해해야 시뮬레이션 클라이언트에 시스템 리"
+"소스를 효율적으로 할당할 수 있습니다."
#: ../../source/how-to-monitor-simulation.rst:136
msgid ""
"Initially, the simulation (which Ray handles under the hood) starts by "
"default with all the available resources on the system, which it shares "
-"among the clients. It doesn't mean it divides it equally among all of "
-"them, nor that the model training happens at all of them simultaneously. "
-"You will learn more about that in the later part of this blog. You can "
-"check the system resources by running the following:"
-msgstr ""
-"처음에 시뮬레이션(Ray가 내부에서 처리하는)은 기본적으로 시스템에서 사용 "
-"가능한 모든 리소스를 사용하여 시작되며, 이 리소스는 클라이언트 간에 "
-"공유됩니다. 그렇다고 해서 모든 클라이언트에게 균등하게 분배하거나 모든 "
-"클라이언트에서 동시에 모델 학습이 이루어지는 것은 아닙니다. 이에 대한 자세한 "
-"내용은 이 블로그의 뒷부분에서 설명합니다. 다음을 실행하여 시스템 리소스를 "
-"확인할 수 있습니다:"
+"among the clients. It doesn't mean it divides it equally among all of them, "
+"nor that the model training happens at all of them simultaneously. You will "
+"learn more about that in the later part of this blog. You can check the "
+"system resources by running the following:"
+msgstr ""
+"처음에 시뮬레이션(Ray가 내부에서 처리하는)은 기본적으로 시스템에서 사용 가능"
+"한 모든 리소스를 사용하여 시작되며, 이 리소스는 클라이언트 간에 공유됩니다. "
+"그렇다고 해서 모든 클라이언트에게 균등하게 분배하거나 모든 클라이언트에서 동"
+"시에 모델 학습이 이루어지는 것은 아닙니다. 이에 대한 자세한 내용은 이 블로그"
+"의 뒷부분에서 설명합니다. 다음을 실행하여 시스템 리소스를 확인할 수 있습니다:"
#: ../../source/how-to-monitor-simulation.rst:143
msgid "In Google Colab, the result you see might be similar to this:"
@@ -5495,10 +5551,11 @@ msgstr "Google Colab에서는 이와 유사한 결과가 표시될 수 있습니
#: ../../source/how-to-monitor-simulation.rst:155
msgid ""
-"However, you can overwrite the defaults. When starting a simulation, do "
-"the following (you don't need to overwrite all of them):"
-msgstr "그러나 기본값을 덮어쓸 수 있습니다. 시뮬레이션을 시작할 때 다음을 수행합니다("
-"모두 덮어쓸 필요는 없음):"
+"However, you can overwrite the defaults. When starting a simulation, do the "
+"following (you don't need to overwrite all of them):"
+msgstr ""
+"그러나 기본값을 덮어쓸 수 있습니다. 시뮬레이션을 시작할 때 다음을 수행합니다"
+"(모두 덮어쓸 필요는 없음):"
#: ../../source/how-to-monitor-simulation.rst:175
msgid "Let’s also specify the resource for a single client."
@@ -5506,28 +5563,28 @@ msgstr "단일 클라이언트에 대한 리소스도 지정해 보겠습니다.
#: ../../source/how-to-monitor-simulation.rst:205
msgid ""
-"Now comes the crucial part. Ray will start a new client only when it has "
-"all the required resources (such that they run in parallel) when the "
-"resources allow."
+"Now comes the crucial part. Ray will start a new client only when it has all "
+"the required resources (such that they run in parallel) when the resources "
+"allow."
msgstr ""
-"이제 중요한 부분이 나옵니다. Ray는 리소스가 허용하는 경우에만 필요한 모든 "
-"리소스가 있을 때(병렬로 실행되는 등) 새 클라이언트를 시작합니다."
+"이제 중요한 부분이 나옵니다. Ray는 리소스가 허용하는 경우에만 필요한 모든 리"
+"소스가 있을 때(병렬로 실행되는 등) 새 클라이언트를 시작합니다."
#: ../../source/how-to-monitor-simulation.rst:207
msgid ""
-"In the example above, only one client will be run, so your clients won't "
-"run concurrently. Setting :code:`client_num_gpus = 0.5` would allow "
-"running two clients and therefore enable them to run concurrently. Be "
-"careful not to require more resources than available. If you specified "
-":code:`client_num_gpus = 2`, the simulation wouldn't start (even if you "
-"had 2 GPUs but decided to set 1 in :code:`ray_init_args`)."
+"In the example above, only one client will be run, so your clients won't run "
+"concurrently. Setting :code:`client_num_gpus = 0.5` would allow running two "
+"clients and therefore enable them to run concurrently. Be careful not to "
+"require more resources than available. If you specified :code:"
+"`client_num_gpus = 2`, the simulation wouldn't start (even if you had 2 GPUs "
+"but decided to set 1 in :code:`ray_init_args`)."
msgstr ""
-"위의 예에서는 하나의 클라이언트만 실행되므로 클라이언트가 동시에 실행되지 "
-"않습니다. :code:`client_num_gpus = 0.5` 를 설정하면 두 개의 클라이언트를 "
-"실행할 수 있으므로 동시에 실행할 수 있습니다. 사용 가능한 리소스보다 더 많은 "
-"리소스를 요구하지 않도록 주의하세요. :code:`client_num_gpus = 2`를 지정하면 "
-"시뮬레이션이 시작되지 않습니다(GPU가 2개이지만 :code:`ray_init_args`에서 "
-"1개를 설정한 경우에도 마찬가지입니다)."
+"위의 예에서는 하나의 클라이언트만 실행되므로 클라이언트가 동시에 실행되지 않"
+"습니다. :code:`client_num_gpus = 0.5` 를 설정하면 두 개의 클라이언트를 실행"
+"할 수 있으므로 동시에 실행할 수 있습니다. 사용 가능한 리소스보다 더 많은 리소"
+"스를 요구하지 않도록 주의하세요. :code:`client_num_gpus = 2`를 지정하면 시뮬"
+"레이션이 시작되지 않습니다(GPU가 2개이지만 :code:`ray_init_args`에서 1개를 설"
+"정한 경우에도 마찬가지입니다)."
#: ../../source/how-to-monitor-simulation.rst:212 ../../source/ref-faq.rst:2
msgid "FAQ"
@@ -5539,29 +5596,29 @@ msgstr "질문: 기록된 메트릭이 보이지 않습니다."
#: ../../source/how-to-monitor-simulation.rst:216
msgid ""
-"A: The timeframe might not be properly set. The setting is in the top "
-"right corner (\"Last 30 minutes\" by default). Please change the "
-"timeframe to reflect the period when the simulation was running."
+"A: The timeframe might not be properly set. The setting is in the top right "
+"corner (\"Last 30 minutes\" by default). Please change the timeframe to "
+"reflect the period when the simulation was running."
msgstr ""
-"A: 기간이 제대로 설정되지 않았을 수 있습니다. 설정은 오른쪽 상단에 있습니다("
-"기본값은 '지난 30분'). 시뮬레이션이 실행된 기간을 반영하도록 기간을 변경해 "
+"A: 기간이 제대로 설정되지 않았을 수 있습니다. 설정은 오른쪽 상단에 있습니다"
+"(기본값은 '지난 30분'). 시뮬레이션이 실행된 기간을 반영하도록 기간을 변경해 "
"주세요."
#: ../../source/how-to-monitor-simulation.rst:218
msgid ""
-"Q: I see “Grafana server not detected. Please make sure the Grafana "
-"server is running and refresh this page” after going to the Metrics tab "
-"in Ray Dashboard."
+"Q: I see “Grafana server not detected. Please make sure the Grafana server "
+"is running and refresh this page” after going to the Metrics tab in Ray "
+"Dashboard."
msgstr ""
-"질문: \"Grafana 서버가 감지되지 않았습니다. Ray 대시보드의 메트릭 탭으로 "
-"이동한 후 Grafana 서버가 실행 중인지 확인하고 이 페이지를 새로고침하세요."
-"\"라는 메시지가 표시됩니다."
+"질문: \"Grafana 서버가 감지되지 않았습니다. Ray 대시보드의 메트릭 탭으로 이동"
+"한 후 Grafana 서버가 실행 중인지 확인하고 이 페이지를 새로고침하세요.\"라는 "
+"메시지가 표시됩니다."
#: ../../source/how-to-monitor-simulation.rst:220
msgid ""
-"A: You probably don't have Grafana running. Please check the running "
-"services"
-msgstr "A: Grafana가 실행되고 있지 않을 수 있습니다. 실행 중인 서비스를 확인하세요"
+"A: You probably don't have Grafana running. Please check the running services"
+msgstr ""
+"A: Grafana가 실행되고 있지 않을 수 있습니다. 실행 중인 서비스를 확인하세요"
#: ../../source/how-to-monitor-simulation.rst:226
msgid ""
@@ -5573,8 +5630,8 @@ msgstr ""
#: ../../source/how-to-monitor-simulation.rst:228
msgid ""
-"A: Either the simulation has already finished, or you still need to start"
-" Prometheus."
+"A: Either the simulation has already finished, or you still need to start "
+"Prometheus."
msgstr "A: 시뮬레이션이 이미 완료되었거나 아직 Prometheus를 시작해야 합니다."
#: ../../source/how-to-monitor-simulation.rst:232
@@ -5599,14 +5656,13 @@ msgstr "Docker를 사용하여 Flower 실행"
#: ../../source/how-to-run-flower-using-docker.rst:4
msgid ""
-"The simplest way to get started with Flower is by using the pre-made "
-"Docker images, which you can find on `Docker Hub "
-"`__. Supported architectures include "
-"``amd64`` and ``arm64v8``."
+"The simplest way to get started with Flower is by using the pre-made Docker "
+"images, which you can find on `Docker Hub `__. Supported architectures include ``amd64`` and ``arm64v8``."
msgstr ""
"Flower를 시작하는 가장 간단한 방법은 `Docker Hub `__에서 찾을 수 있는 미리 만들어진 Docker 이미지를 사용하는 것입니다. "
-"지원되는 아키텍처는 ``amd64`` 및 ``arm64v8``입니다."
+"flwr>`__에서 찾을 수 있는 미리 만들어진 Docker 이미지를 사용하는 것입니다. 지"
+"원되는 아키텍처는 ``amd64`` 및 ``arm64v8``입니다."
#: ../../source/how-to-run-flower-using-docker.rst:8
msgid "Before you start, make sure that the Docker daemon is running:"
@@ -5614,10 +5670,9 @@ msgstr "시작하기 전에 Docker daemon이 실행 중인지 확인하세요:"
#: ../../source/how-to-run-flower-using-docker.rst:15
msgid ""
-"If you do not see the version of Docker but instead get an error saying "
-"that the command was not found, you will need to install Docker first. "
-"You can find installation instruction `here `_."
+"If you do not see the version of Docker but instead get an error saying that "
+"the command was not found, you will need to install Docker first. You can "
+"find installation instruction `here `_."
msgstr ""
"전이 표시되지 않고 대신 명령을 찾을 수 없다는 오류가 표시되는 경우 먼저 "
"Docker를 설치해야 합니다. `여기 `_에서 "
@@ -5625,26 +5680,26 @@ msgstr ""
#: ../../source/how-to-run-flower-using-docker.rst:21
msgid ""
-"On Linux, Docker commands require ``sudo`` privilege. If you want to "
-"avoid using ``sudo``, you can follow the `Post-installation steps "
-"`_ on the "
-"official Docker website."
+"On Linux, Docker commands require ``sudo`` privilege. If you want to avoid "
+"using ``sudo``, you can follow the `Post-installation steps `_ on the official Docker "
+"website."
msgstr ""
-"Linux에서 Docker 명령을 실행하려면 ``sudo`` 권한이 필요합니다. sudo``를 "
+"Linux에서 Docker 명령을 실행하려면 ``sudo`` 권한이 필요합니다. ``sudo`` 를 "
"사용하지 않으려면 공식 Docker 웹사이트의 `Post-installation steps "
"`_를 따르세요."
#: ../../source/how-to-run-flower-using-docker.rst:27
msgid ""
-"To ensure optimal performance and compatibility, the SuperLink, SuperNode"
-" and ServerApp image must have the same version when running together. "
-"This guarantees seamless integration and avoids potential conflicts or "
-"issues that may arise from using different versions."
+"To ensure optimal performance and compatibility, the SuperLink, SuperNode "
+"and ServerApp image must have the same version when running together. This "
+"guarantees seamless integration and avoids potential conflicts or issues "
+"that may arise from using different versions."
msgstr ""
"최적의 성능과 호환성을 보장하려면 SuperLink, SuperNode 및 ServerApp 이미지를 "
-"함께 실행할 때 버전이 동일해야 합니다. 이렇게 하면 원활한 통합을 보장하고 "
-"서로 다른 버전을 사용할 때 발생할 수 있는 잠재적인 충돌이나 문제를 방지할 수 "
-"있습니다."
+"함께 실행할 때 버전이 동일해야 합니다. 이렇게 하면 원활한 통합을 보장하고 서"
+"로 다른 버전을 사용할 때 발생할 수 있는 잠재적인 충돌이나 문제를 방지할 수 있"
+"습니다."
#: ../../source/how-to-run-flower-using-docker.rst:32
msgid "Flower SuperLink"
@@ -5660,60 +5715,60 @@ msgstr "Flower를 사용해보고 싶다면 다음 명령을 사용하면 됩니
#: ../../source/how-to-run-flower-using-docker.rst:43
msgid ""
-"The command pulls the Docker image with the tag ``1.8.0`` from Docker "
-"Hub. The tag specifies the Flower version. In this case, Flower 1.8.0. "
-"The ``--rm`` flag tells Docker to remove the container after it exits."
+"The command pulls the Docker image with the tag ``1.8.0`` from Docker Hub. "
+"The tag specifies the Flower version. In this case, Flower 1.8.0. The ``--"
+"rm`` flag tells Docker to remove the container after it exits."
msgstr ""
"이 명령은 Docker Hub에서 ``1.8.0`` 태그가 있는 Docker 이미지를 가져옵니다. "
-"이 태그는 Flower 버전을 지정합니다. 이 경우, Flower 1.8.0입니다. '`--rm`` "
-"플래그는 컨테이너가 종료된 후 컨테이너를 제거하도록 Docker에 지시합니다."
+"이 태그는 Flower 버전을 지정합니다. 이 경우, Flower 1.8.0입니다. '`--rm`` 플"
+"래그는 컨테이너가 종료된 후 컨테이너를 제거하도록 Docker에 지시합니다."
#: ../../source/how-to-run-flower-using-docker.rst:49
msgid ""
"By default, the Flower SuperLink keeps state in-memory. When using the "
-"Docker flag ``--rm``, the state is not persisted between container "
-"starts. We will show below how to save the state in a file on your host "
-"system."
+"Docker flag ``--rm``, the state is not persisted between container starts. "
+"We will show below how to save the state in a file on your host system."
msgstr ""
"기본적으로 Flower SuperLink는 상태를 in-memory에 유지합니다. Docker 플래그 "
-"`--rm``을 사용하는 경우 컨테이너 시작 사이에 상태가 유지되지 않습니다. "
-"아래에서 호스트 시스템의 파일에 상태를 저장하는 방법을 보여드리겠습니다."
+"`--rm``을 사용하는 경우 컨테이너 시작 사이에 상태가 유지되지 않습니다. 아래에"
+"서 호스트 시스템의 파일에 상태를 저장하는 방법을 보여드리겠습니다."
#: ../../source/how-to-run-flower-using-docker.rst:53
msgid ""
-"The ``-p :`` flag tells Docker to map the ports "
-"``9091``/``9092`` of the host to ``9091``/``9092`` of the container, "
-"allowing you to access the Driver API on ``http://localhost:9091`` and "
-"the Fleet API on ``http://localhost:9092``. Lastly, any flag that comes "
-"after the tag is passed to the Flower SuperLink. Here, we are passing the"
-" flag ``--insecure``."
+"The ``-p :`` flag tells Docker to map the ports ``9091``/"
+"``9092`` of the host to ``9091``/``9092`` of the container, allowing you to "
+"access the Driver API on ``http://localhost:9091`` and the Fleet API on "
+"``http://localhost:9092``. Lastly, any flag that comes after the tag is "
+"passed to the Flower SuperLink. Here, we are passing the flag ``--insecure``."
msgstr ""
-"``-p