diff --git a/dev/test.sh b/dev/test.sh index 5b827380bc50..8cbe88c9298b 100755 --- a/dev/test.sh +++ b/dev/test.sh @@ -23,7 +23,7 @@ python -m flwr_tool.init_py_check src/py/flwr src/py/flwr_tool echo "- init_py_check: done" echo "- docformatter: start" -python -m docformatter -c -r src/py/flwr e2e -e src/py/flwr/proto +python -m docformatter -c -r src/py/flwr e2e -e src/py/flwr/proto echo "- docformatter: done" echo "- ruff: start" diff --git a/doc/locales/ko/LC_MESSAGES/framework-docs.po b/doc/locales/ko/LC_MESSAGES/framework-docs.po index 9c8d2f5ff19b..74cb5f00589f 100644 --- a/doc/locales/ko/LC_MESSAGES/framework-docs.po +++ b/doc/locales/ko/LC_MESSAGES/framework-docs.po @@ -8,15 +8,16 @@ 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-16 09:09+0000\n" +"PO-Revision-Date: 2024-06-22 10:52+0000\n" "Last-Translator: 박태현 \n" +"Language-Team: Korean \n" "Language: ko\n" -"Language-Team: Korean \n" -"Plural-Forms: nplurals=1; plural=0;\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.6-rc\n" "Generated-By: Babel 2.15.0\n" #: ../../source/contributor-explanation-architecture.rst:2 @@ -58,7 +59,6 @@ msgid "How to build Docker Flower images locally" msgstr "Docker Flower 이미지를 Locally 구축하는 방법" #: ../../source/contributor-how-to-build-docker-images.rst:4 -#, fuzzy msgid "" "Flower provides pre-made docker images on `Docker Hub " "`_ that include all necessary dependencies" @@ -68,11 +68,12 @@ msgid "" " 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 이미지를 빌드할 수도 있습니다. 이 가이드에서는 존재하는 이미지들과 이들을 로컬에서 빌드하는 " -"방법에 대해 설명하겠습니다." +"Flower는 'Docker Hub '_에서 미리 만들어진 " +"Docker 이미지들을 제공합니다. 해당 이미지들은 SuperLink, ServerNode 또는 " +"ServerApp을 실행하는 데 필요한 모든 dependencies를 포함합니다. 필요한 경우 " +"다른 버전의 Python이나 Linux 배포판(Ubuntu/Alpine)을 사용해 처음부터 사용자 " +"정의 Docker 이미지를 빌드할 수도 있습니다. 이 가이드에서는 존재하는 " +"이미지들과 이들을 로컬에서 빌드하는 방법에 대해 설명하겠습니다." #: ../../source/contributor-how-to-build-docker-images.rst:10 msgid "" @@ -108,7 +109,6 @@ msgstr "" "디렉토리에서 찾을 수 있습니다." #: ../../source/contributor-how-to-build-docker-images.rst:28 -#, fuzzy msgid "" "Flower Docker images are configured via build arguments. Through build " "arguments, we can make the creation of images more flexible. For example," @@ -118,10 +118,12 @@ msgid "" "available build arguments for each image are listed in one of the tables " "below." msgstr "" -"base 이미지와 SuperLink 이미지 둘 다 빌드 argument들을 통해 구성됩니다. 빌드 argument들을 통해, 빌드를" -" 더 유연하게 만들 수 있습니다. 예를 들어, base 이미지에서 \"PYTHON_VERSION\" 빌드 argument를 사용하여" -" Python 버전을 지정할 수 있습니다. 일부 빌드 argument들은 기본값이며, 이미지를 빌드할 때 지정해야 합니다. 각 " -"이미지에 사용할 수 있는 모든 빌드 argument는 아래 표 중에 있습니다." +"Flower Docker는 빌드 argument를 통해 구성됩니다. 빌드 argument들을 통해, " +"이미지를 보다 유연하게 생성할 수 있습니다. 예를 들어, base 이미지에서 " +"\"PYTHON_VERSION\" 빌드 argument를 사용하여 Python 버전을 지정할 수 " +"있습니다. 일부 빌드 argument들은 기본값이며, 이미지를 빌드할 때 지정해야 " +"합니다. 각 이미지에 사용할 수 있는 모든 빌드 argument는 아래 표 중에 " +"있습니다." #: ../../source/contributor-how-to-build-docker-images.rst:35 msgid "Building the base image" @@ -149,12 +151,11 @@ msgstr "예시" #: ../../source/contributor-how-to-build-docker-images.rst:45 msgid "``DISTRO``" -msgstr "" +msgstr "``DISTRO``" #: ../../source/contributor-how-to-build-docker-images.rst:46 -#, fuzzy msgid "The Linux distribution to use as the base image." -msgstr "base 이미지의 Ubuntu 버전." +msgstr "base 이미지 사용을 위한 Linux 배포판." #: ../../source/contributor-how-to-build-docker-images.rst:47 #: ../../source/contributor-how-to-build-docker-images.rst:51 @@ -162,26 +163,23 @@ msgstr "base 이미지의 Ubuntu 버전." #: ../../source/contributor-how-to-build-docker-images.rst:71 #: ../../source/contributor-how-to-build-docker-images.rst:104 msgid "No" -msgstr "" +msgstr "아니오" #: ../../source/contributor-how-to-build-docker-images.rst:48 -#, fuzzy msgid "``ubuntu``" -msgstr "``UBUNTU_VERSION``" +msgstr "``ubuntu``" #: ../../source/contributor-how-to-build-docker-images.rst:49 -#, fuzzy msgid "``DISTRO_VERSION``" -msgstr "``PIP_VERSION``" +msgstr "``DISTRO_VERSION``" #: ../../source/contributor-how-to-build-docker-images.rst:50 msgid "Version of the Linux distribution." -msgstr "" +msgstr "Linux 배포판 버전." #: ../../source/contributor-how-to-build-docker-images.rst:52 -#, fuzzy msgid "``22.04``" -msgstr "``23.0.1``" +msgstr "``22.04``" #: ../../source/contributor-how-to-build-docker-images.rst:53 msgid "``PYTHON_VERSION``" @@ -193,7 +191,7 @@ msgstr "설치 된 ``python`` 버전." #: ../../source/contributor-how-to-build-docker-images.rst:56 msgid "``3.11`` or ``3.11.1``" -msgstr "" +msgstr "``3.11`` 또는 ``3.11.1``" #: ../../source/contributor-how-to-build-docker-images.rst:57 msgid "``PIP_VERSION``" @@ -243,20 +241,20 @@ msgid "``FLWR_PACKAGE``" msgstr "``FLWR_PACKAGE``" #: ../../source/contributor-how-to-build-docker-images.rst:70 -#, fuzzy msgid "The Flower package to be installed." -msgstr "설치 할 PyPI 패키지." +msgstr "설치 할 Flower 패키지." #: ../../source/contributor-how-to-build-docker-images.rst:72 msgid "``flwr`` or ``flwr-nightly``" -msgstr "" +msgstr "``flwr`` 또는 ``flwr-nightly``" #: ../../source/contributor-how-to-build-docker-images.rst:75 -#, fuzzy 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:" -msgstr "다음 예시에서는 Python 3.11.0, pip 23.0.1 그리고 setuptools 69.0.2의 base 이미지를 만듭니다:" +msgstr "" +"다음 예시에서는 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 "" @@ -268,9 +266,8 @@ msgstr "" " 태그도 정할 수 있습니다. 이 값들은 예시일 뿐입니다." #: ../../source/contributor-how-to-build-docker-images.rst:92 -#, fuzzy msgid "Building the SuperLink/SuperNode or ServerApp image" -msgstr "SuperLink 이미지 빌드" +msgstr "SuperLink/SuperNode 또는 ServerApp 이미지 빌드" #: ../../source/contributor-how-to-build-docker-images.rst:102 msgid "``BASE_REPOSITORY``" @@ -281,42 +278,36 @@ msgid "The repository name of the base image." msgstr "base 이미지의 리포지토리 이름." #: ../../source/contributor-how-to-build-docker-images.rst:105 -#, fuzzy msgid "``flwr/base``" -msgstr "``FLWR_PACKAGE``" +msgstr "``flwr/base``" #: ../../source/contributor-how-to-build-docker-images.rst:106 -#, fuzzy msgid "``BASE_IMAGE``" -msgstr "``BASE_REPOSITORY``" +msgstr "``BASE_IMAGE``" #: ../../source/contributor-how-to-build-docker-images.rst:107 -#, fuzzy msgid "The Tag of the Flower base image." -msgstr "base 이미지의 리포지토리 이름." +msgstr "Flower 기본 이미지의 태그." #: ../../source/contributor-how-to-build-docker-images.rst:109 msgid "``1.8.0-py3.10-ubuntu22.04``" -msgstr "" +msgstr "``1.8.0-py3.10-ubuntu22.04``" #: ../../source/contributor-how-to-build-docker-images.rst:111 -#, fuzzy msgid "" "The following example creates a SuperLink/SuperNode or ServerApp image " "with the official Flower base image:" -msgstr "" -"다음 예시에서는 py3.11-ubuntu22.04 및 Flower 1.8.0의 공식 Flower base 이미지로 SuperLink" -" 이미지를 만듭니다:" +msgstr "다음 예시에서는 공식 Flower 기본 이미지로 SuperLink/SuperNode 또는 " +"ServerApp이미지를 만듭니다:" #: ../../source/contributor-how-to-build-docker-images.rst:122 -#, fuzzy 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." msgstr "" -"공식 Flower base 이미지 대신 자체 base 이미지를 사용 하길 원한다면, ``BASE_REPOSITORY``, " -"``PYTHON_VERSION`` 및 ``UBUNTU_VERSION`` 빌드 argument들을 설정해야 합니다." +"공식 Flower 기본 이미지 대신 자체 기본 이미지를 사용 하길 원한다면, " +"``BASE_REPOSITORY`` 빌드 argument들을 설정해야 합니다." #: ../../source/contributor-how-to-build-docker-images.rst:133 msgid "After creating the image, we can test whether the image is working:" @@ -818,15 +809,18 @@ msgid "" "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에 생성됩니다." #: ../../source/contributor-how-to-release-flower.rst:14 msgid "Check the draft release on GitHub, and if everything is good, publish it." -msgstr "" +msgstr "GitHub에서 릴리즈 초안을 확인하고, 모든 것이 양호하면 게시하세요." #: ../../source/contributor-how-to-release-flower.rst:15 -#, fuzzy msgid "Trigger the CI for building the Docker images." -msgstr "공식 Ubuntu Docker 이미지 버전." +msgstr "Docker 이미지 빌드를 위해 CI를 트리거합니다." #: ../../source/contributor-how-to-release-flower.rst:17 msgid "" @@ -835,124 +829,136 @@ msgid "" "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 를 통해 수행할 수 있습니다. " +"이벤트는 Flower 버전 한 가지 입력만 필요합니다." #: ../../source/contributor-how-to-release-flower.rst:21 msgid "**Via the UI**" -msgstr "" +msgstr "**UI를 통해서**" #: ../../source/contributor-how-to-release-flower.rst:23 msgid "" "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 "" +msgstr "``Run workflow`` 버튼을 누르고 ``Version of Flower``에 Flower의 새버전을 " +"입력합니다." #: ../../source/contributor-how-to-release-flower.rst:25 msgid "Click on the **green** ``Run workflow`` button." -msgstr "" +msgstr "**초록색**의 ``Run workflow``버튼을 클릭합니다." #: ../../source/contributor-how-to-release-flower.rst:29 msgid "**Via the GitHub CI**" -msgstr "" +msgstr "**GitHub CI를 통해서**" #: ../../source/contributor-how-to-release-flower.rst:31 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 "" +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=``을 통해 " +"워크플로우 를 트리거합니다." #: ../../source/contributor-how-to-release-flower.rst:35 msgid "After the release" -msgstr "" +msgstr "릴리즈 후에" #: ../../source/contributor-how-to-release-flower.rst:37 msgid "Create a pull request which contains the following changes:" -msgstr "" +msgstr "다음 변경 사항이 포함된 pull request를 만듭니다:" #: ../../source/contributor-how-to-release-flower.rst:39 msgid "Increase the minor version in ``pyproject.toml`` by one." -msgstr "" +msgstr "``pyproject.toml``의 마이너 버전을 하나씩 늘립니다." #: ../../source/contributor-how-to-release-flower.rst:40 msgid "Update all files which contain the current version number if necessary." -msgstr "" +msgstr "필요한 경우 현재 버전 번호가 포함된 모든 파일을 업데이트합니다." #: ../../source/contributor-how-to-release-flower.rst:41 msgid "Add a new ``Unreleased`` section in ``changelog.md``." -msgstr "" +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 "" +msgstr "pull request를 같은 날(즉, 새로운 nightly 릴리즈가 PyPI에 게시되기 전에) " +"병합하세요." #: ../../source/contributor-how-to-release-flower.rst:46 msgid "Publishing a pre-release" -msgstr "" +msgstr "사전 릴리즈 게시" #: ../../source/contributor-how-to-release-flower.rst:49 msgid "Pre-release naming" -msgstr "" +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:" msgstr "" +"PyPI는 사전 릴리즈(알파, 베타, 릴리스 후보)를 지원합니다. 사전 릴리즈는 " +"반드시 다음 명명 패턴 중 하나를 사용해야 합니다:" #: ../../source/contributor-how-to-release-flower.rst:53 msgid "Alpha: ``MAJOR.MINOR.PATCHaN``" -msgstr "" +msgstr "Alpha: ``MAJOR.MINOR.PATCHaN``" #: ../../source/contributor-how-to-release-flower.rst:54 msgid "Beta: ``MAJOR.MINOR.PATCHbN``" -msgstr "" +msgstr "Beta: ``MAJOR.MINOR.PATCHbN``" #: ../../source/contributor-how-to-release-flower.rst:55 msgid "Release candidate (RC): ``MAJOR.MINOR.PATCHrcN``" -msgstr "" +msgstr "Release candidate (RC): ``MAJOR.MINOR.PATCHrcN``" #: ../../source/contributor-how-to-release-flower.rst:57 msgid "Examples include:" -msgstr "" +msgstr "예시:" #: ../../source/contributor-how-to-release-flower.rst:59 msgid "``1.0.0a0``" -msgstr "" +msgstr "``1.0.0a0``" #: ../../source/contributor-how-to-release-flower.rst:60 msgid "``1.0.0b0``" -msgstr "" +msgstr "``1.0.0b0``" #: ../../source/contributor-how-to-release-flower.rst:61 msgid "``1.0.0rc0``" -msgstr "" +msgstr "``1.0.0rc0``" #: ../../source/contributor-how-to-release-flower.rst:62 msgid "``1.0.0rc1``" -msgstr "" +msgstr "``1.0.0rc1``" #: ../../source/contributor-how-to-release-flower.rst:64 msgid "" "This is in line with PEP-440 and the recommendations from the Python " "Packaging Authority (PyPA):" -msgstr "" +msgstr "이는 PEP-440 및 Python Packaging Authority (PyPA)의 권장 사항과 일치합니다:" #: ../../source/contributor-how-to-release-flower.rst:67 msgid "`PEP-440 `_" -msgstr "" +msgstr "`PEP-440 `_" #: ../../source/contributor-how-to-release-flower.rst:68 msgid "" @@ -960,6 +966,8 @@ msgid "" "`_" msgstr "" +"`PyPA 버전 관리 체계 선택하기 `_" #: ../../source/contributor-how-to-release-flower.rst:70 msgid "" @@ -968,14 +976,17 @@ msgid "" "`_ (specifically item " "11 on precedence)." msgstr "" +"PyPA에서 정의한 접근 방식은 SemVer 2.0.0 사양과 호환되지 않으며, 자세한 " +"내용은`Semantic Versioning 관리 사양 `_ (특히 항목 11이 우선순위)을 참조하세요." #: ../../source/contributor-how-to-release-flower.rst:73 msgid "Pre-release classification" -msgstr "" +msgstr "사전 릴리즈 분류" #: ../../source/contributor-how-to-release-flower.rst:75 msgid "Should the next pre-release be called alpha, beta, or release candidate?" -msgstr "" +msgstr "다음 사전 릴리를 알파, 베타 또는 릴리스 후보라고 불러야 하나요?" #: ../../source/contributor-how-to-release-flower.rst:77 msgid "" @@ -983,18 +994,20 @@ msgid "" "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 릴리즈가 됩니다" #: ../../source/contributor-how-to-release-flower.rst:78 msgid "Beta: feature complete, allowed to have known issues" -msgstr "" +msgstr "베타: 기능 완료, 알려진 문제 발생 가능" #: ../../source/contributor-how-to-release-flower.rst:79 msgid "Alpha: not feature complete, allowed to have known issues" -msgstr "" +msgstr "알파: 기능 미완성, 알려진 문제가 있을 수 있음" #: ../../source/contributor-how-to-set-up-a-virtual-env.rst:2 msgid "Set up a virtual env" -msgstr "" +msgstr "가상 환경 설정" #: ../../source/contributor-how-to-set-up-a-virtual-env.rst:4 msgid "" @@ -1003,10 +1016,13 @@ msgid "" "environment with pyenv virtualenv, poetry, or Anaconda. You can follow " "the instructions or choose your preferred setup." msgstr "" +"가상 환경 내에서 파이썬 설정을 실행하는 것이 좋습니다. 이 가이드에서는 pyenv " +"virtualenv, poetry 또는 Anaconda를 사용하여 가상 환경을 만드는 세 가지 " +"예제를 보여줍니다. 안내를 따르거나 원하는 설정을 선택할 수 있습니다." #: ../../source/contributor-how-to-set-up-a-virtual-env.rst:9 msgid "Python Version" -msgstr "" +msgstr "Python 버전" #: ../../source/contributor-how-to-set-up-a-virtual-env.rst:11 #: ../../source/how-to-install-flower.rst:8 @@ -1015,6 +1031,8 @@ msgid "" "but `Python 3.10 `_ or above is " "recommended." msgstr "" +"Flower는 `Python 3.8 `_이상이 필요하지만, `" +"Python 3.10 `_이상을 권장합니다." #: ../../source/contributor-how-to-set-up-a-virtual-env.rst:14 msgid "" @@ -1023,10 +1041,13 @@ msgid "" "most `Python 3.11 `_ for running Flower " "simulations." msgstr "" +"`Ray `__와 호환되지 않는 것으로 알려져 " +"있으므로, 현재 Flower 시뮬레이션을 실행할 때는 최대 `Python 3.11 " +"`_을 사용하는 것이 좋습니다." #: ../../source/contributor-how-to-set-up-a-virtual-env.rst:19 msgid "Virtualenv with Pyenv/Virtualenv" -msgstr "" +msgstr "Pyenv/Virtualenv를 사용한 가상 환경" #: ../../source/contributor-how-to-set-up-a-virtual-env.rst:21 msgid "" @@ -1035,24 +1056,30 @@ msgid "" "/pyenv-virtualenv>`_. Please see `Flower examples " "`_ for details." msgstr "" +"권장 가상 환경 중 하나는 `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 `_ 이상'을 설치할 수 있습니다:" #: ../../source/contributor-how-to-set-up-a-virtual-env.rst:29 msgid "Create the virtualenv with:" -msgstr "" +msgstr "가상 환경을 만듭니다:" #: ../../source/contributor-how-to-set-up-a-virtual-env.rst:36 msgid "Activate the virtualenv by running the following command:" -msgstr "" +msgstr "다음 명령을 실행하여 가상 환경을 활성화합니다:" #: ../../source/contributor-how-to-set-up-a-virtual-env.rst:44 msgid "Virtualenv with Poetry" -msgstr "" +msgstr "Poetry를 사용한 가상 환경" #: ../../source/contributor-how-to-set-up-a-virtual-env.rst:46 msgid "" @@ -1060,16 +1087,20 @@ msgid "" "poetry.org/docs/>`_ to manage dependencies. After installing Poetry you " "simply create a virtual environment with:" msgstr "" +"Flower examples은 dependencies을 관리하기 위해 `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 "" +msgstr "새 터미널을 열면 다음 명령을 사용하여 이전에 생성한 가상 환경을 활성화할 수 " +"있습니다:" #: ../../source/contributor-how-to-set-up-a-virtual-env.rst:60 msgid "Virtualenv with Anaconda" -msgstr "" +msgstr "Anaconda를 사용한 가상 환경" #: ../../source/contributor-how-to-set-up-a-virtual-env.rst:62 msgid "" @@ -1078,28 +1109,33 @@ msgid "" "/user-guide/install/index.html>`_ package. After setting it up you can " "create a virtual environment with:" msgstr "" +"가상 환경에서 Anaconda를 사용하려면 `conda `_ 패키지를 설치 및 " +"설정하세요. 설정 후 다음을 사용하여 가상 환경을 만들 수 있습니다:" #: ../../source/contributor-how-to-set-up-a-virtual-env.rst:68 msgid "and activate the virtual environment with:" -msgstr "" +msgstr "그 후 가상 환경을 활성화합니다:" #: ../../source/contributor-how-to-set-up-a-virtual-env.rst:76 msgid "And then?" -msgstr "" +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 `_." msgstr "" +"가상 환경을 생성하자마자 'Flower examples `_ 중 하나를 클론합니다." #: ../../source/contributor-how-to-write-documentation.rst:2 msgid "Write documentation" -msgstr "" +msgstr "문서 작성" #: ../../source/contributor-how-to-write-documentation.rst:6 msgid "Project layout" -msgstr "" +msgstr "프로젝트 레이아웃" #: ../../source/contributor-how-to-write-documentation.rst:8 msgid "" @@ -1107,6 +1143,9 @@ msgid "" " documentation system supports both reStructuredText (``.rst`` files) and" " Markdown (``.md`` files)." msgstr "" +"Flower 문서는 ``doc`` 디렉토리에 있습니다. Sphinx 기반 문서 시스템은 " +"reStructuredText 텍스트(``.rst`` 파일)와 Markdown(``.md`` 파일)을 모두 " +"지원합니다." #: ../../source/contributor-how-to-write-documentation.rst:10 #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:169 @@ -1116,44 +1155,47 @@ msgid "" "`_ needs to be installed on the " "system." msgstr "" +"로컬에서 문서를 작성하려면(아래 설명과 같이 ``poetry run make html``로) `" +"Pandoc `_이 시스템에 설치되어 있어야 " +"합니다." #: ../../source/contributor-how-to-write-documentation.rst:14 msgid "Edit an existing page" -msgstr "" +msgstr "기존 페이지 편집" #: ../../source/contributor-how-to-write-documentation.rst:16 msgid "Edit an existing ``.rst`` (or ``.md``) file under ``doc/source/``" -msgstr "" +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 "" +msgstr "문서를 컴파일합니다: ``cd doc``, ``poetry run make html`` 순으로 컴파일합니다" #: ../../source/contributor-how-to-write-documentation.rst:18 #: ../../source/contributor-how-to-write-documentation.rst:28 msgid "Open ``doc/build/html/index.html`` in the browser to check the result" -msgstr "" +msgstr "브라우저에서 ``doc/build/html/index.html``을 열어 결과를 확인합니다" #: ../../source/contributor-how-to-write-documentation.rst:22 msgid "Create a new page" -msgstr "" +msgstr "새 페이지 만들기" #: ../../source/contributor-how-to-write-documentation.rst:24 msgid "Add new ``.rst`` file under ``doc/source/``" -msgstr "" +msgstr "``doc/source/`에 새 ``.rst`` 을 추가합니다" #: ../../source/contributor-how-to-write-documentation.rst:25 msgid "Add content to the new ``.rst`` file" -msgstr "" +msgstr "새 '.rst' 파일에 내용을 추가합니다" #: ../../source/contributor-how-to-write-documentation.rst:26 msgid "Link to the new rst from ``index.rst``" -msgstr "" +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 "" @@ -1162,10 +1204,13 @@ msgid "" "where to start to increase your chances of getting your PR accepted into " "the Flower codebase." msgstr "" +"Flower에 대한 기여를 환영합니다! 하지만 어디서부터 시작해야 할지 알기란 쉽지 " +"않습니다. 그래서 저희는 여러분의 PR이 Flower 코드베이스에 채택될 가능성을 " +"높이기 위해 어디서부터 시작해야 하는지 몇 가지 권장 사항을 정리해 보았습니다." #: ../../source/contributor-ref-good-first-contributions.rst:11 msgid "Where to start" -msgstr "" +msgstr "시작 위치" #: ../../source/contributor-ref-good-first-contributions.rst:13 msgid "" @@ -1173,22 +1218,25 @@ msgid "" "accepted if they only touch non-core areas of the codebase. Good " "candidates to get started are:" msgstr "" +"Flower 코어 라이브러리가 완성될 때까지는 코드베이스의 비핵심 영역만 건드리는 " +"것이 PR을 승인받기가 더 쉬울 것입니다. 시작하기에 좋은 후보자는 다음과 " +"같습니다:" #: ../../source/contributor-ref-good-first-contributions.rst:17 msgid "Documentation: What's missing? What could be expressed more clearly?" -msgstr "" +msgstr "문서: 무엇이 누락되었나요? 무엇을 더 명확하게 표현할 수 있을까요?" #: ../../source/contributor-ref-good-first-contributions.rst:18 msgid "Baselines: See below." -msgstr "" +msgstr "Baselines: 아래를 참조하세요." #: ../../source/contributor-ref-good-first-contributions.rst:19 msgid "Examples: See below." -msgstr "" +msgstr "예시: 아래를 참조하세요." #: ../../source/contributor-ref-good-first-contributions.rst:23 msgid "Request for Flower Baselines" -msgstr "" +msgstr "Flower Baselines 요청" #: ../../source/contributor-ref-good-first-contributions.rst:25 msgid "" @@ -1196,6 +1244,8 @@ msgid "" "out our `contributing guide for baselines " "`_." msgstr "" +"Flower Baseline에 익숙하지 않다면 ' Baseline 기여 가이드 `_를 확인해보세요." #: ../../source/contributor-ref-good-first-contributions.rst:27 msgid "" @@ -1205,16 +1255,21 @@ msgid "" " 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 "" +msgstr "그렇지 않으면 작업하고 싶은 baseline을 찾지 못하면 baseline 요청 템플릿으로 " +"새 이슈를 열어야 합니다!" #: ../../source/contributor-ref-good-first-contributions.rst:34 msgid "Request for examples" -msgstr "" +msgstr "예시 요청" #: ../../source/contributor-ref-good-first-contributions.rst:36 msgid "" @@ -1222,22 +1277,25 @@ msgid "" "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을 " +"수락할 수 있는 몇 가지 아이디어입니다:" #: ../../source/contributor-ref-good-first-contributions.rst:40 msgid "Llama 2 fine-tuning, with Hugging Face Transformers and PyTorch" -msgstr "" +msgstr "Llama 2 미세 조정, Hugging Face Transformer와 파이토치 포함" #: ../../source/contributor-ref-good-first-contributions.rst:41 msgid "XGBoost" -msgstr "" +msgstr "XGBoost" #: ../../source/contributor-ref-good-first-contributions.rst:42 msgid "Android ONNX on-device training" -msgstr "" +msgstr "Android ONNX 온디바이스 훈련" #: ../../source/contributor-ref-secure-aggregation-protocols.rst:2 msgid "Secure Aggregation Protocols" -msgstr "" +msgstr "Secure Aggregation 프로토콜" #: ../../source/contributor-ref-secure-aggregation-protocols.rst:4 msgid "" @@ -1246,10 +1304,14 @@ msgid "" " 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+ 프로토콜의 특수한 경우로 간주할 수 " +"있습니다." #: ../../source/contributor-ref-secure-aggregation-protocols.rst:8 msgid "The :code:`SecAgg+` abstraction" -msgstr "" +msgstr "The :code:`SecAgg+` 추상화" #: ../../source/contributor-ref-secure-aggregation-protocols.rst:10 #: ../../source/contributor-ref-secure-aggregation-protocols.rst:161 @@ -1258,31 +1320,35 @@ msgid "" "(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 " +"타입의 키가 있습니다." #: ../../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:" -msgstr "" +msgstr "Flower 서버는 수신된 결과를 다음 순서로 실행하고 처리합니다:" #: ../../source/contributor-ref-secure-aggregation-protocols.rst:159 msgid "The :code:`LightSecAgg` abstraction" -msgstr "" +msgstr "The :code:`LightSecAgg` 추상" #: ../../source/contributor-ref-secure-aggregation-protocols.rst:271 msgid "Types" -msgstr "" +msgstr "타입" #: ../../source/contributor-tutorial-contribute-on-github.rst:2 msgid "Contribute on GitHub" -msgstr "" +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 "" +msgstr "이 가이드는 Flower에 참여하고 싶지만 GitHub 프로젝트에 기여하는 데 익숙하지 " +"않은 분들을 위한 것입니다." #: ../../source/contributor-tutorial-contribute-on-github.rst:6 msgid "" @@ -1290,14 +1356,16 @@ msgid "" "directly checkout our :doc:`getting started guide for contributors " "`." msgstr "" +"깃허브에서 기여하는 방식에 익숙하다면 :doc:`기여자를 위한 시작 가이드" +"`를 직접 확인하세요." #: ../../source/contributor-tutorial-contribute-on-github.rst:10 msgid "Setting up the repository" -msgstr "" +msgstr "레포지토리 설정하기" #: ../../source/contributor-tutorial-contribute-on-github.rst:21 msgid "**Create a GitHub account and setup Git**" -msgstr "" +msgstr "**GitHub 계정을 만들고 Git을 설정합니다**" #: ../../source/contributor-tutorial-contribute-on-github.rst:13 msgid "" @@ -1307,6 +1375,10 @@ msgid "" "follow this `guide `_ to set it up." msgstr "" +"Git은 분산 버전 관리 도구입니다. 이를 통해 전체 코드베이스의 히스토리와 모든 " +"개발자의 컴퓨터를 저장할 수 있습니다. 로컬 컴퓨터에 설치해야 하는 " +"소프트웨어로, 이 `가이드 `_를 따라 설정할 수 있습니다." #: ../../source/contributor-tutorial-contribute-on-github.rst:16 msgid "" @@ -1314,12 +1386,15 @@ msgid "" "collaboration. It allows for everyone to collaborate and work from " "anywhere on remote repositories." msgstr "" +"GitHub는 그 자체로 버전 관리 및 협업을 위한 코드 호스팅 플랫폼입니다. 누구나 " +"원격 레포지토리에서 어디서든 협업하고 작업할 수 있습니다." #: ../../source/contributor-tutorial-contribute-on-github.rst:18 msgid "" "If you haven't already, you will need to create an account on `GitHub " "`_." -msgstr "" +msgstr "아직 계정을 만들지 않았다면 `GitHub `_에서 계정을 " +"만들어야 합니다." #: ../../source/contributor-tutorial-contribute-on-github.rst:20 msgid "" @@ -1328,10 +1403,13 @@ msgid "" "locally and keep track of them using Git and then you upload your new " "history back to GitHub." msgstr "" +"일반적인 Git 및 GitHub 워크플로우의 기본 개념은 다음과 같이 요약됩니다. " +"GitHub의 원격 레포지토리에서 코드를 다운로드하고 로컬에서 변경한 후 Git을 " +"사용하여 추적한 다음 새 기록을 다시 GitHub에 업로드하는 것입니다." #: ../../source/contributor-tutorial-contribute-on-github.rst:32 msgid "**Forking the Flower repository**" -msgstr "" +msgstr "**Flower 레포지토리 포크하기**" #: ../../source/contributor-tutorial-contribute-on-github.rst:24 msgid "" @@ -1340,6 +1418,9 @@ msgid "" "connected to your GitHub account) and click the ``Fork`` button situated " "on the top right of the page." msgstr "" +"포크는 GitHub 리포지토리의 개인 복사본입니다. Flower용 포크를 만들려면 " +"``_로 이동하여(GitHub 계정에 연결된 상태에서)" +" 페이지 오른쪽 상단에 있는 ``포크`` 버튼을 클릭해야 합니다." #: ../../source/contributor-tutorial-contribute-on-github.rst:29 msgid "" @@ -1348,10 +1429,13 @@ msgid "" "(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 버전이 표시되는 것을 볼 수 있습니다." #: ../../source/contributor-tutorial-contribute-on-github.rst:47 msgid "**Cloning your forked repository**" -msgstr "" +msgstr "**포크된 레포지토리 클론하기**" #: ../../source/contributor-tutorial-contribute-on-github.rst:35 msgid "" @@ -1360,26 +1444,31 @@ msgid "" "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 링크를 복사할 수 있습니다." #: ../../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 "" +msgstr "현재 작업 디렉터리에``flower/``(또는 포크 이름을 변경한 경우 포크 이름) " +"폴더가 생성됩니다." #: ../../source/contributor-tutorial-contribute-on-github.rst:66 msgid "**Add origin**" -msgstr "" +msgstr "**origin 추가**" #: ../../source/contributor-tutorial-contribute-on-github.rst:50 msgid "You can then go into the repository folder:" -msgstr "" +msgstr "그런 다음 레포지토리 폴더로 이동할 수 있습니다:" #: ../../source/contributor-tutorial-contribute-on-github.rst:56 msgid "" @@ -1388,26 +1477,30 @@ msgid "" "previously mentioned by going to our fork repository on our GitHub " "account and copying the link." msgstr "" +"여기에 레포지토리에 origin을 추가해야 합니다. origin은 원격 포크 " +"레포지토리의 \\입니다. origin을 얻으려면 앞서 설명한 대로 GitHub " +"계정의 포크 레포지토리로 이동하여 링크를 복사하면 됩니다." #: ../../source/contributor-tutorial-contribute-on-github.rst:61 msgid "" "Once the \\ is copied, we can type the following command in our " "terminal:" -msgstr "" +msgstr "\\ 이 복사되면 터미널에 다음 명령을 입력하면 됩니다:" #: ../../source/contributor-tutorial-contribute-on-github.rst:90 msgid "**Add upstream**" -msgstr "" +msgstr "**Upstream 추가하기**" #: ../../source/contributor-tutorial-contribute-on-github.rst:69 msgid "" "Now we will add an upstream address to our repository. Still in the same " "directory, we must run the following command:" -msgstr "" +msgstr "이제 레포지토리에 upstream 주소를 추가하겠습니다. 여전히 같은 디렉터리에서 " +"다음 명령을 실행해야 합니다:" #: ../../source/contributor-tutorial-contribute-on-github.rst:76 msgid "The following diagram visually explains what we did in the previous steps:" -msgstr "" +msgstr "다음 다이어그램은 이전 단계에서 수행한 작업을 시각적으로 설명합니다:" #: ../../source/contributor-tutorial-contribute-on-github.rst:80 msgid "" @@ -1417,16 +1510,21 @@ msgid "" "remote address of the forked repository we created, i.e. the copy (fork) " "in our own account." msgstr "" +"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 "" +msgstr "로컬 버전의 포크가 Flower 레포지토리의 최신 변경 사항으로 최신 상태인지 " +"확인하려면 다음 명령을 실행하면 됩니다:" #: ../../source/contributor-tutorial-contribute-on-github.rst:93 msgid "Setting up the coding environment" -msgstr "" +msgstr "코딩 환경 설정" #: ../../source/contributor-tutorial-contribute-on-github.rst:95 msgid "" @@ -1435,49 +1533,53 @@ msgid "" "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:'기여자를 위한 시작 가이드 '를 참조하세요(리포지토리를 복제할 필요는 없습니다). 코드를 " +"작성하고 테스트할 수 있게 되면 드디어 변경을 시작할 수 있습니다!" #: ../../source/contributor-tutorial-contribute-on-github.rst:100 msgid "Making changes" -msgstr "" +msgstr "변경하기" #: ../../source/contributor-tutorial-contribute-on-github.rst:102 msgid "" "Before making any changes make sure you are up-to-date with your " "repository:" -msgstr "" +msgstr "변경하기 전에 레포지토리를 최신 상태로 유지하세요:" #: ../../source/contributor-tutorial-contribute-on-github.rst:108 msgid "And with Flower's repository:" -msgstr "" +msgstr "Flower의 레포지토리도 있습니다:" #: ../../source/contributor-tutorial-contribute-on-github.rst:122 msgid "**Create a new branch**" -msgstr "" +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 "" +msgstr "히스토리를 더 깔끔하고 작업하기 쉽게 만들려면 구현해야 하는 각 기능/" +"프로젝트에 대해 새 브랜치를 만드는 것이 좋습니다." #: ../../source/contributor-tutorial-contribute-on-github.rst:118 msgid "" "To do so, just run the following command inside the repository's " "directory:" -msgstr "" +msgstr "이렇게 하려면 레포지토리 디렉토리에서 다음 명령을 실행하면 됩니다:" #: ../../source/contributor-tutorial-contribute-on-github.rst:125 msgid "**Make changes**" -msgstr "" +msgstr "**변경하기**" #: ../../source/contributor-tutorial-contribute-on-github.rst:125 msgid "Write great code and create wonderful changes using your favorite editor!" -msgstr "" +msgstr "선호하 편집기를 사용하여 멋진 코드를 작성하고 훌륭한 변화를 만들어 보세요!" #: ../../source/contributor-tutorial-contribute-on-github.rst:138 msgid "**Test and format your code**" -msgstr "" +msgstr "**코드 테스트 및 서식 지정**" #: ../../source/contributor-tutorial-contribute-on-github.rst:128 msgid "" @@ -1485,24 +1587,28 @@ msgid "" "able to be merged into the Flower repository. This is done so the " "codebase stays consistent and easy to understand." msgstr "" +"코드를 테스트하고 서식을 지정하는 것을 잊지 마세요! 그렇지 않으면 코드를 " +"Flower 레포지토리에 병합할 수 없습니다. 이는 코드베이스가 일관성을 유지하고 " +"이해하기 쉽도록 하기 위한 것입니다." #: ../../source/contributor-tutorial-contribute-on-github.rst:131 msgid "To do so, we have written a few scripts that you can execute:" -msgstr "" +msgstr "이를 위해 실행할 수 있는 몇 가지 스크립트를 작성했습니다:" #: ../../source/contributor-tutorial-contribute-on-github.rst:150 msgid "**Stage changes**" -msgstr "" +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 "" +msgstr "기록을 업데이트할 커밋을 만들기 전에 어떤 파일을 고려해야 하는지 Git에 " +"지정해야 합니다." #: ../../source/contributor-tutorial-contribute-on-github.rst:143 msgid "This can be done with:" -msgstr "" +msgstr "이 작업을 수행할 수 있습니다:" #: ../../source/contributor-tutorial-contribute-on-github.rst:149 msgid "" @@ -1510,16 +1616,20 @@ msgid "" "(last commit) and to see which files are staged for commit, you can use " "the :code:`git status` command." msgstr "" +"마지막 버전(마지막 커밋)과 비교하여 수정된 파일을 확인하고 커밋을 위해 " +"스테이징된 파일을 확인하려면 :code:`git status` 명령을 사용하면 됩니다." #: ../../source/contributor-tutorial-contribute-on-github.rst:160 msgid "**Commit changes**" -msgstr "" +msgstr "**Commit 변경**" #: ../../source/contributor-tutorial-contribute-on-github.rst:153 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`를 사용하여 커밋하려는 모든 파일을 추가한 후, 마지막으로 이 " +"명령을 사용하여 커밋을 생성할 수 있습니다:" #: ../../source/contributor-tutorial-contribute-on-github.rst:159 msgid "" @@ -1527,10 +1637,13 @@ msgid "" "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\"`." #: ../../source/contributor-tutorial-contribute-on-github.rst:171 msgid "**Push the changes to the fork**" -msgstr "" +msgstr "**변경 사항을 포크에 푸시**" #: ../../source/contributor-tutorial-contribute-on-github.rst:163 msgid "" @@ -1538,40 +1651,44 @@ msgid "" " history, but GitHub has no way of knowing this unless we push our " "changes to our origin's remote address:" msgstr "" +"변경 사항을 커밋하면 로컬 히스토리를 효과적으로 업데이트한 것이지만, 변경 " +"사항을 원본의 원격 주소로 푸시하지 않는 한 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 "" +msgstr "이 작업이 완료되면 변경한 내용으로 포크된 레포지토리가 업데이트된 것을 " +"GitHub에서 확인할 수 있습니다." #: ../../source/contributor-tutorial-contribute-on-github.rst:174 msgid "Creating and merging a pull request (PR)" -msgstr "" +msgstr "pull request(PR) 만들기 및 병합하기" #: ../../source/contributor-tutorial-contribute-on-github.rst:206 msgid "**Create the PR**" -msgstr "" +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 "" +msgstr "변경 사항을 푸시하고 나면 레포지토리의 GitHub 웹페이지에 다음 메시지가 " +"표시됩니다:" #: ../../source/contributor-tutorial-contribute-on-github.rst:181 msgid "Otherwise you can always find this option in the ``Branches`` page." -msgstr "" +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 "" +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:" -msgstr "" +msgstr "상단에는 어느 지점이 어디에 병합될 것인지에 대한 설명이 있습니다:" #: ../../source/contributor-tutorial-contribute-on-github.rst:191 msgid "" @@ -1579,6 +1696,8 @@ msgid "" "``doc-fixes`` from my forked repository to branch ``main`` from the " "Flower repository." msgstr "" +"이 예제에서는 내 포크된 레포지토리의 ``doc-fixes`` 브랜치를 Flower " +"레포지토리의 ``main`` 브랜치에 병합하라는 요청을 볼 수 있습니다." #: ../../source/contributor-tutorial-contribute-on-github.rst:193 msgid "" @@ -1586,6 +1705,9 @@ msgid "" "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을 병합할 수 없습니다. 따라서 이 경우 올바른 제목은 " +"``docs(framework:skip) Fix typos``이 될 수 있습니다." #: ../../source/contributor-tutorial-contribute-on-github.rst:196 msgid "" @@ -1594,10 +1716,13 @@ msgid "" "won't be rendered once the PR is opened) to guide you through the " "process." msgstr "" +"가운데에 있는 입력 상자는 PR의 기능을 설명하고 기존 이슈에 연결할 수 있는 " +"곳입니다. 프로세스를 안내하기 위해 코멘트(PR이 열리면 렌더링되지 않음)를 " +"배치했습니다." #: ../../source/contributor-tutorial-contribute-on-github.rst:199 msgid "It is important to follow the instructions described in comments." -msgstr "" +msgstr "코멘트에 설명된 지침을 따르는 것이 중요합니다." #: ../../source/contributor-tutorial-contribute-on-github.rst:201 msgid "" @@ -1605,155 +1730,176 @@ msgid "" "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:" msgstr "" +"PR이 아직 검토할 준비가 되지 않았고 다른 사람에게 알리고 싶지 않은 경우 pull " +"request 초안을 만드는 옵션이 있습니다:" #: ../../source/contributor-tutorial-contribute-on-github.rst:209 msgid "**Making new changes**" -msgstr "" +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 "" +msgstr "PR이 초안으로 열렸든 아니든, PR과 연결된 브랜치를 변경하여 이전과 같은 " +"방식으로 새 커밋을 푸시할 수 있습니다." #: ../../source/contributor-tutorial-contribute-on-github.rst:231 msgid "**Review the PR**" -msgstr "" +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 "" +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 "" +msgstr "그러면 코드 소유자는 코드를 살펴보고, 질문하고, 변경을 요청하거나 PR의 " +"유효성을 검사합니다." #: ../../source/contributor-tutorial-contribute-on-github.rst:218 msgid "Merging will be blocked if there are ongoing requested changes." -msgstr "" +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 "" +msgstr "이를 해결하려면 PR과 연결된 브랜치에 필요한 변경 사항을 푸시하면 됩니다:" #: ../../source/contributor-tutorial-contribute-on-github.rst:226 msgid "And resolve the conversation:" -msgstr "" +msgstr "그리고 소통을 통해 해결하세요:" #: ../../source/contributor-tutorial-contribute-on-github.rst:230 msgid "" "Once all the conversations have been resolved, you can re-request a " "review." -msgstr "" +msgstr "모든 대화가 해결되면 검토를 다시 요청할 수 있습니다." #: ../../source/contributor-tutorial-contribute-on-github.rst:251 msgid "**Once the PR is merged**" -msgstr "" +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 "" +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 "" +msgstr "병합이 완료되면 GitHub에서 브랜치를 삭제할 수 있으며(삭제 버튼이 표시되어야 " +"함), 로컬에서도 삭제할 수 있습니다:" #: ../../source/contributor-tutorial-contribute-on-github.rst:245 msgid "Then you should update your forked repository by doing:" -msgstr "" +msgstr "그런 다음 다음을 수행하여 포크된 레포지토리를 업데이트해야 합니다:" #: ../../source/contributor-tutorial-contribute-on-github.rst:254 msgid "Example of first contribution" -msgstr "" +msgstr "첫 번째 기여의 예" #: ../../source/contributor-tutorial-contribute-on-github.rst:257 msgid "Problem" -msgstr "" +msgstr "문제" #: ../../source/contributor-tutorial-contribute-on-github.rst:259 msgid "" "For our documentation, we've started to use the `Diàtaxis framework " "`_." -msgstr "" +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\"." msgstr "" +"'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 "" +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\"으로 변경한 예를 들어 " +"보겠습니다. 이것이 우리의 점검을 통과했나요?" #: ../../source/contributor-tutorial-contribute-on-github.rst:269 msgid "Before: \"How to saving progress\" ❌" -msgstr "" +msgstr "Before: \"How to saving progress\" ❌" #: ../../source/contributor-tutorial-contribute-on-github.rst:271 msgid "After: \"How to save progress\" ✅" -msgstr "" +msgstr "After: \"How to save progress\" ✅" #: ../../source/contributor-tutorial-contribute-on-github.rst:274 msgid "Solution" -msgstr "" +msgstr "해결법" #: ../../source/contributor-tutorial-contribute-on-github.rst:276 msgid "" "This is a tiny change, but it'll allow us to test your end-to-end setup. " "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``" -msgstr "" +msgstr "``doc/source``에서 소스 파일을 찾습니다" #: ../../source/contributor-tutorial-contribute-on-github.rst:279 msgid "" "Make the change in the ``.rst`` file (beware, the dashes under the title " "should be the same length as the title itself)" -msgstr "" +msgstr "``.rst`` 파일에서 변경합니다(제목 아래의 대시는 제목 자체의 길이와 같아야 " +"합니다)" #: ../../source/contributor-tutorial-contribute-on-github.rst:280 msgid "" "Build the docs and `check the result `_" msgstr "" +"문서를 빌드하고 '결과 확인 `_'합니다" #: ../../source/contributor-tutorial-contribute-on-github.rst:283 msgid "Rename file" -msgstr "" +msgstr "파일 이름 바꾸기" #: ../../source/contributor-tutorial-contribute-on-github.rst:285 msgid "" @@ -1762,28 +1908,33 @@ msgid "" "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:" -msgstr "" +msgstr "파일 이름을 변경하는 방법은 다음과 같습니다:" #: ../../source/contributor-tutorial-contribute-on-github.rst:290 msgid "Change the file name to ``save-progress.rst``" -msgstr "" +msgstr "파일 이름을 ``save-progress.rst``로 변경합니다" #: ../../source/contributor-tutorial-contribute-on-github.rst:291 msgid "Add a redirect rule to ``doc/source/conf.py``" -msgstr "" +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." msgstr "" +"이렇게 하면 ``saving-progress.html``에서 ``save-progress.html``로 " +"리디렉션되며, 이전 링크는 계속 작동합니다." #: ../../source/contributor-tutorial-contribute-on-github.rst:296 msgid "Apply changes in the index file" -msgstr "" +msgstr "인덱스 파일에 변경 사항 적용" #: ../../source/contributor-tutorial-contribute-on-github.rst:298 msgid "" @@ -1791,38 +1942,42 @@ msgid "" "update the ``index.rst`` file as well. This is where we define the whole " "arborescence of the navbar." msgstr "" +"횡방향 내비게이션 바가 제대로 작동하려면 ``index.rst`` 파일도 업데이트하는 " +"것이 매우 중요합니다. 이 파일은 탐색 모음의 전체 배열을 정의하는 곳입니다." #: ../../source/contributor-tutorial-contribute-on-github.rst:301 msgid "Find and modify the file name in ``index.rst``" -msgstr "" +msgstr "``index.rst``에서 파일 이름을 찾아 수정합니다" #: ../../source/contributor-tutorial-contribute-on-github.rst:304 msgid "Open PR" -msgstr "" +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 …\")" msgstr "" +"변경 사항을 커밋합니다(커밋 메시지는 항상 필수 메시지입니다:\"Do something\"(" +"이 경우 는 \"Change …\" )" #: ../../source/contributor-tutorial-contribute-on-github.rst:307 msgid "Push the changes to your fork" -msgstr "" +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 "" +msgstr "``docs(framework) Update how-to guide title`` 제목으로 PR(위와 같이)을 엽니다" #: ../../source/contributor-tutorial-contribute-on-github.rst:309 msgid "Wait for it to be approved!" -msgstr "" +msgstr "승인될 때까지 기다리세요!" #: ../../source/contributor-tutorial-contribute-on-github.rst:310 msgid "Congrats! 🥳 You're now officially a Flower contributor!" -msgstr "" +msgstr "축하합니다! 이제 공식적으로 Flower 기여자가 되셨습니다!" #: ../../source/contributor-tutorial-contribute-on-github.rst:314 #: ../../source/tutorial-series-build-a-strategy-from-scratch-pytorch.ipynb:548 @@ -1831,13 +1986,13 @@ msgstr "" #: ../../source/tutorial-series-use-a-federated-learning-strategy-pytorch.ipynb:713 #: ../../source/tutorial-series-what-is-federated-learning.ipynb:367 msgid "Next steps" -msgstr "" +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 "" +msgstr "첫 번째 PR을 작성하고 더 많은 기여를 하고 싶다면 다음 을 확인하세요:" #: ../../source/contributor-tutorial-contribute-on-github.rst:318 msgid "" @@ -1845,25 +2000,28 @@ msgid "" "contributions>`, where you should particularly look into the " ":code:`baselines` contributions." msgstr "" +":doc:`훌륭한 첫 번째 기여 `, 특히 " +":code:`baselines` 기여를 살펴봐야 합니다." #: ../../source/contributor-tutorial-contribute-on-github.rst:322 #: ../../source/fed/0000-20200102-fed-template.md:60 msgid "Appendix" -msgstr "" +msgstr "부록" #: ../../source/contributor-tutorial-contribute-on-github.rst:327 msgid "PR title format" -msgstr "" +msgstr "PR 제목 형식" #: ../../source/contributor-tutorial-contribute-on-github.rst:329 msgid "We enforce the following PR title format:" -msgstr "" +msgstr "다음과 같은 PR 제목 형식을 적용합니다:" #: ../../source/contributor-tutorial-contribute-on-github.rst:335 msgid "" "(or ``(:skip) `` to ignore the PR in the " "changelog)" -msgstr "" +msgstr "(또는 ``(:skip) ``를 사용하면 변경 로그에서 PR을 " +"무시합니다.)" #: ../../source/contributor-tutorial-contribute-on-github.rst:337 msgid "" @@ -1873,77 +2031,81 @@ msgid "" "':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' 플래그를 " +"사용해야 하는 여러 프로젝트를 수정하는 경우}``로 입력해야 하며, ````" +"는 대문자로 시작해야 합니다." #: ../../source/contributor-tutorial-contribute-on-github.rst:341 msgid "Valid examples:" -msgstr "" +msgstr "유효한 예시입니다:" #: ../../source/contributor-tutorial-contribute-on-github.rst:343 msgid "``feat(framework) Add flwr build CLI command``" -msgstr "" +msgstr "``feat(framework) Add flwr build CLI command``" #: ../../source/contributor-tutorial-contribute-on-github.rst:344 msgid "``refactor(examples:skip) Improve quickstart-pytorch logging``" -msgstr "" +msgstr "``refactor(examples:skip) Improve quickstart-pytorch logging``" #: ../../source/contributor-tutorial-contribute-on-github.rst:345 msgid "``ci(*:skip) Enforce PR title format``" -msgstr "" +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 ``:``)" -msgstr "" +msgstr "``feat(framework): Add flwr build CLI command`` ( ``:``제외)" #: ../../source/contributor-tutorial-contribute-on-github.rst:350 msgid "" "``feat(*) Add flwr build CLI command`` (missing ``skip`` flag along with " "``*``)" -msgstr "" +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 ````)" -msgstr "" +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 "" +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)" -msgstr "" +msgstr "``feat(framework) Add flwr build CLI command.`` (끝에 마침표)" #: ../../source/contributor-tutorial-contribute-on-github.rst:354 msgid "``Add flwr build CLI command.`` (missing ``()``)" -msgstr "" +msgstr "``Add flwr build CLI command.`` ( ``()``누락)" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:2 msgid "Get started as a contributor" -msgstr "" +msgstr "기여자로 시작하기" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:5 #: ../../source/how-to-run-flower-using-docker.rst:153 msgid "Prerequisites" -msgstr "" +msgstr "전제 조건" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:7 msgid "`Python 3.8 `_ or above" -msgstr "" +msgstr "Python 3.8 `_ 이상" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:8 msgid "`Poetry 1.3 `_ or above" -msgstr "" +msgstr "`Poetry 1.3 `_ _ 이상" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:9 msgid "(Optional) `pyenv `_" -msgstr "" +msgstr "(선택 사항) `pyenv `_" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:10 msgid "(Optional) `pyenv-virtualenv `_" -msgstr "" +msgstr "(선택 사항) `pyenv-virtualenv `_" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:12 msgid "" @@ -1951,54 +2113,62 @@ msgid "" "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 msgid "Developer Machine Setup" -msgstr "" +msgstr "개발자 머신 설정" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:21 msgid "Preliminarities" -msgstr "" +msgstr "사전 준비" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:22 msgid "Some system-wide dependencies are needed." -msgstr "" +msgstr "일부 시스템 전체에 대한 dependencies이 필요합니다." #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:25 msgid "For macOS" -msgstr "" +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." msgstr "" +"`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 "" +msgstr "xz`(다른 Python 버전을 설치하려면)와 `pandoc`을 설치하여 문서를 빌드합니다::" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:34 msgid "For Ubuntu" -msgstr "" +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 "" +msgstr "시스템(우분투 22.04 이상)이 최신 상태이고 필요한 패키지가 모두 설치되어 " +"있는지 확인하세요:" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:44 msgid "Create Flower Dev Environment" -msgstr "" +msgstr "Flower 개발 환경 만들기" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:46 msgid "" "1. Clone the `Flower repository `_ from " "GitHub::" msgstr "" +"1. GitHub: 에서 ``Flower 레포지토리 `_를 " +"복제합니다::" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:52 msgid "" @@ -2008,6 +2178,10 @@ msgid "" "environment, activate and skip to the last point where all packages are " "installed." msgstr "" +"Flower의 모든 것을 위한 파이썬 환경을 만들어 보겠습니다.:code:`pyenv`를 " +"사용하고자 하는 경우 사용할 수 있는 두 가지 편의 스크립트를 " +"제공합니다.:code:`pyenv`가 아닌 다른 것을 사용하려면 새 환경을 생성하고 " +"활성화한 후 모든 패키지가 설치된 마지막 지점으로 건너뛰세요." #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:54 msgid "" @@ -2015,6 +2189,8 @@ msgid "" " 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` 사용):" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:58 msgid "" @@ -2022,16 +2198,21 @@ msgid "" "virtualenv` plugin), you can use the following convenience script (with " ":code:`Python 3.8.17` by default)::" msgstr "" +":code:`pyenv`가 이미 설치되어 있는 경우( :code:`pyenv-virtualenv` 플러그인과 " +"함께) 다음과 같은 편의 스크립트를 사용할 수 있습니다(기본적으로 코드:`Python " +"3.8.17` 사용):" #: ../../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::" msgstr "" +"3. 필요한 모든 dependencies와 함께 개발 모드에서 Flower 패키지를 " +"설치합니다(예:code:`pip install -e`)::" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:69 msgid "Convenience Scripts" -msgstr "" +msgstr "편의 스크립트" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:71 msgid "" @@ -2040,26 +2221,29 @@ msgid "" ":code:`/dev` subdirectory for a full list. The following scripts are " "amongst the most important ones:" msgstr "" +"Flower 레포지토리에는 반복적인 개발 작업을 더 쉽고 오류를 줄이기 위한 여러 " +"가지 편의 스크립트가 포함되어 있습니다. 전체 목록은 :code:`/dev` 하위 " +"디렉터리를 참조하세요. 다음 스크립트는 가장 중요한 스크립트 중 하나입니다:" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:77 msgid "Create/Delete Virtual Environment" -msgstr "" +msgstr "가상 환경 생성/삭제" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:85 msgid "Compile ProtoBuf Definitions" -msgstr "" +msgstr "ProtoBuf 정의 컴파일" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:92 msgid "Auto-Format Code" -msgstr "" +msgstr "자동 포맷 코드" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:99 msgid "Run Linters and Tests" -msgstr "" +msgstr "린터 및 테스트 실행" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:106 msgid "Add a pre-commit hook" -msgstr "" +msgstr "사전 커밋 훅 추가" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:108 msgid "" @@ -2068,26 +2252,30 @@ msgid "" "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`` 스크립트." #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:110 msgid "There are multiple ways developers can use this:" -msgstr "" +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:" -msgstr "" +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." -msgstr "" +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 "" +msgstr "급한 경우 ``git commit`` 명령과 함께 `--no-verify``를 사용하여 훅을 넘기세요:" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:124 msgid "" @@ -2095,16 +2283,19 @@ msgid "" "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 "" +msgstr "이렇게 하면 ``git commit``의 기본 동작을 수정하지 않고 모든 파일에 대해 포맷 " +"및 린팅 검사/테스트를 실행합니다." #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:133 msgid "Run Github Actions (CI) locally" -msgstr "" +msgstr "로컬에서 Github Action(CI) 실행하기" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:135 msgid "" @@ -2113,32 +2304,38 @@ msgid "" "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 메인 클론 레포지토리 폴더 아래에서 다음 " +"명령을 실행하세요::" #: ../../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 "" +msgstr "Flower 기본 워크플로우는 아래에 필요한 Docker 머신을 설정하여 실행합니다." #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:147 msgid "Build Release" -msgstr "" +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 "" +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 "" +msgstr "결과물인 :code:`.whl` 및 :code:`.tar.gz` 릴리즈는 :code:`/dist` 하위 " +"디렉터리에 저장됩니다." #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:159 msgid "Build Documentation" -msgstr "" +msgstr "문서 빌드" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:161 msgid "" @@ -2146,14 +2343,17 @@ msgid "" "There's no convenience script to re-build the documentation yet, but it's" " pretty easy::" msgstr "" +"Flower의 문서는 `Sphinx `_를 사용합니다. 아직 " +"문서를 다시 작성할 수 있는 편리한 스크립트는 없지만 다음과 같이 쉽게 작성할 " +"수 있습니다:" #: ../../source/contributor-tutorial-get-started-as-a-contributor.rst:167 msgid "This will generate HTML documentation in ``doc/build/html``." -msgstr "" +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 "" +msgstr "예시: PyTorch에서 FedBN - Centralize에서 Federated으로" #: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:4 msgid "" @@ -2166,11 +2366,18 @@ msgid "" "PyTorch - From Centralized To Federated `." msgstr "" +"이 튜토리얼에서는 non-iid data를 위해 설계된 federated 훈련 전략인 `FedBN " +"`_으로 기존 머신러닝 워크로드의 federated " +"버전을 구축하기 위해 Flower를 사용하는 방법을 보여드립니다. 우리는 PyTorch를 " +"사용하여 CIFAR-10 데이터 세트에서 컨볼루션 신경망(일괄 정규화 레이어 포함)을 " +"훈련하고 있습니다. FedBN을 적용할 때, :doc:`예제: 파이토치 -Centralized에서 " +"Federated으로 ` 와 비교했을 " +"때 몇 가지 사항만 변경 하면 됩니다." #: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:9 #: ../../source/example-pytorch-from-centralized-to-federated.rst:10 msgid "Centralized Training" -msgstr "" +msgstr "Centralized 훈련" #: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:10 msgid "" @@ -2179,17 +2386,21 @@ msgid "" "thing to do is modifying the file called :code:`cifar.py`, revised part " "is shown below:" msgstr "" +"모든 파일은 :doc:`예제: 파이토치 - Centralized에서 Federated으로 `를 기반으로 수정합니다. :code:`cifar." +"py`라는 파일을 수정하기만 하면 되며, 수정된 부분은 아래와 같습니다:" #: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:13 msgid "" "The model architecture defined in class Net() is added with Batch " "Normalization layers accordingly." -msgstr "" +msgstr "Net() 클래스에 정의된 모델 아키텍처는 그에 따라 배치 정규화 레이어가 " +"추가됩니다." #: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:41 #: ../../source/example-pytorch-from-centralized-to-federated.rst:157 msgid "You can now run your machine learning workload:" -msgstr "" +msgstr "이제 머신 러닝 워크로드를 실행할 수 있습니다:" #: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:47 msgid "" @@ -2198,11 +2409,14 @@ msgid "" "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 "" +msgstr "Federated 훈련" #: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:53 msgid "" @@ -2213,12 +2427,21 @@ msgid "" ":doc:`Example: PyTorch - From Centralized To Federated `. first." msgstr "" +":doc:`예제: 파이토치 - Centralized에서 Federated으로 `를 읽었다면, 다음 부분은 쉽게 따라할 수 있으며 " +":code:`client.py`의 :code:`get_parameters`와 :code:`set_parameters` 함수만 " +"수정해야 합니다. 그렇지 않은 경우 :doc:`예제: 파이토치 - Centralized에서 " +"Federated으로 `를 먼저 " +"읽어보세요." #: ../../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." msgstr "" +"이 예제는 하나의 *서버*와 두 개의 *클라이언트*로 구성됩니다. FedBN에서 " +":code:`server.py`는 변경되지 않고 그대로 유지되므로 서버를 바로 시작할 수 " +"있습니다." #: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:62 msgid "" @@ -2227,10 +2450,14 @@ msgid "" "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* 로직을 수정할 것입니다. 서버로 " +"보내거나 서버에서 받을 때 모델 파라미터 목록에서 배치 정규화 파라미터를 " +"제외할 수 있습니다." #: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:85 msgid "Now, you can now open two additional terminal windows and run" -msgstr "" +msgstr "이제 두 개의 터미널 창을 추가로 열고 다음을 실행할 수 있습니다" #: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:91 msgid "" @@ -2238,13 +2465,16 @@ msgid "" "so) and see your (previously centralized) PyTorch project run federated " "learning with FedBN strategy across two clients. Congratulations!" msgstr "" +"를 입력하고(클릭하기 전에 서버가 계속 실행 중인지 확인하세요), (이전에 " +"centralized된) PyTorch 프로젝트가 두 클라이언트에서 FedBN으로 federated " +"학습을 실행하는 것을 확인합니다. 축하합니다!" #: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:94 #: ../../source/example-jax-from-centralized-to-federated.rst:277 #: ../../source/example-pytorch-from-centralized-to-federated.rst:310 #: ../../source/tutorial-quickstart-jax.rst:283 msgid "Next Steps" -msgstr "" +msgstr "다음 단계" #: ../../source/example-fedbn-pytorch-from-centralized-to-federated.rst:96 msgid "" @@ -2256,10 +2486,16 @@ msgid "" "using different subsets of CIFAR-10 on each client? How about adding more" " clients?" msgstr "" +"이 예제의 전체 소스 코드는 '여기 `_'에서 확인할 수 있습니다. " +"물론 이 예제는 두 클라이언트가 완전히 동일한 데이터 세트를 로드하기 때문에 " +"다소 지나치게 단순화되어 있으며, 이는 현실적이지 않습니다. 이제 이 주제를 더 " +"자세히 살펴볼 준비가 되셨습니다. 각 클라이언트에서 서로 다른 CIFAR-10의 하위 " +"집합을 사용해 보는 것은 어떨까요? 클라이언트를 더 추가하는 것은 어떨까요?" #: ../../source/example-jax-from-centralized-to-federated.rst:2 msgid "Example: JAX - Run JAX Federated" -msgstr "" +msgstr "예시: JAX - JAX Federated 실행" #: ../../source/example-jax-from-centralized-to-federated.rst:4 #: ../../source/tutorial-quickstart-jax.rst:10 @@ -2275,6 +2511,15 @@ msgid "" " 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 " +"방식으로 트레이닝을 실행합니다." #: ../../source/example-jax-from-centralized-to-federated.rst:10 #: ../../source/tutorial-quickstart-jax.rst:16 @@ -2282,11 +2527,13 @@ msgid "" "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` 패키지를 설치해야 합니다:" #: ../../source/example-jax-from-centralized-to-federated.rst:18 #: ../../source/tutorial-quickstart-jax.rst:24 msgid "Linear Regression with JAX" -msgstr "" +msgstr "JAX를 사용한 선형 회귀" #: ../../source/example-jax-from-centralized-to-federated.rst:20 #: ../../source/tutorial-quickstart-jax.rst:26 @@ -2296,6 +2543,9 @@ msgid "" "explanation of what's going on then have a look at the official `JAX " "documentation `_." msgstr "" +"먼저 :code:`선형 회귀` 모델을 기반으로 하는 centralized 훈련 코드에 대한 " +"간략한 설명부터 시작하겠습니다. 더 자세한 설명을 원하시면 공식 `JAX 문서 " +"`_를 참조하세요." #: ../../source/example-jax-from-centralized-to-federated.rst:23 #: ../../source/tutorial-quickstart-jax.rst:29 @@ -2309,20 +2559,28 @@ msgid "" "not yet import the :code:`flwr` package for federated learning. This will" " be done later." msgstr "" +"전통적인(centralized) 선형 회귀 훈련에 필요한 모든 구성 요소가 포함된 " +":code:`jax_training.py`라는 새 파일을 생성해 보겠습니다. 먼저, JAX 패키지인 " +":code:`jax`와 :code:`jaxlib`를 가져와야 합니다. 또한 데이터 세트에 " +":code:`make_regression`을 사용하고 데이터 세트를 학습 및 테스트 세트로 " +"분할하기 위해 :code:`train_test_split`을 사용하므로 :code:`sklearn`을 " +"가져와야 합니다. 연합 학습을 위해 아직 :code:`flwr` 패키지를 가져오지 않은 " +"것을 볼 수 있습니다. 이 작업은 나중에 수행됩니다." #: ../../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 "" +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 "" +msgstr "모델 아키텍처(매우 간단한 :code:`선형 회귀` 모델)는 :code:`load_model()`에 " +"정의되어 있습니다." #: ../../source/example-jax-from-centralized-to-federated.rst:59 #: ../../source/tutorial-quickstart-jax.rst:65 @@ -2333,6 +2591,10 @@ msgid "" " 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()`에서 " +"호출됨)로 파생물을 취하므로 손실 함수는 분리되어 있습니다." #: ../../source/example-jax-from-centralized-to-federated.rst:77 #: ../../source/tutorial-quickstart-jax.rst:83 @@ -2341,6 +2603,8 @@ msgid "" ":code:`evaluation()`. The function takes all test examples and measures " "the loss of the linear regression model." msgstr "" +"모델의 평가는 :code:`evaluation()` 함수에 정의되어 있습니다. 이 함수는 모든 " +"테스트 예제를 가져와 선형 회귀 모델의 손실을 측정합니다." #: ../../source/example-jax-from-centralized-to-federated.rst:88 #: ../../source/tutorial-quickstart-jax.rst:94 @@ -2350,11 +2614,14 @@ msgid "" "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()`에 전달됩니다." #: ../../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 "" +msgstr "이제 (centralized) JAX 선형 회귀 워크로드를 실행할 수 있습니다:" #: ../../source/example-jax-from-centralized-to-federated.rst:111 #: ../../source/tutorial-quickstart-jax.rst:117 @@ -2363,11 +2630,14 @@ msgid "" "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를 사용해 본 적이 있다면 이 모든 것이 상당히 익숙해 보일 " +"것입니다. 다음 단계로 넘어가서 우리가 구축한 것을 사용하여 하나의 서버와 두 " +"개의 클라이언트로 구성된 간단한 연합 학습 시스템을 만들어 보겠습니다." #: ../../source/example-jax-from-centralized-to-federated.rst:115 #: ../../source/tutorial-quickstart-jax.rst:121 msgid "JAX meets Flower" -msgstr "" +msgstr "JAX와 Flower의 만남" #: ../../source/example-jax-from-centralized-to-federated.rst:117 #: ../../source/tutorial-quickstart-jax.rst:123 @@ -2381,6 +2651,13 @@ msgid "" "parameter updates. This describes one round of the federated learning " "process, and we repeat this for multiple rounds." msgstr "" +"기존 워크로드를 federating하는 개념은 항상 동일하고 이해하기 쉽습니다. 서버*" +"를 시작한 다음 *서버*에 연결된 *클라이언트*에 대해 :code:`jax_training.py`의 " +"코드를 사용해야 합니다. *서버*는 모델 파라미터를 클라이언트로 전송합니다. " +"클라이언트는 학습을 실행하고 파라미터를 업데이트합니다. 업데이트된 " +"파라미터는 *서버*로 다시 전송되며, 수신된 모든 파라미터 업데이트의 평균을 " +"구합니다. 이는 federated 학습 프로세스의 한 라운드를 설명하며, 이 과정을 " +"여러 라운드에 걸쳐 반복합니다." #: ../../source/example-jax-from-centralized-to-federated.rst:123 #: ../../source/example-pytorch-from-centralized-to-federated.rst:181 @@ -2391,12 +2668,16 @@ msgid "" ":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 #: ../../source/tutorial-quickstart-jax.rst:139 msgid "We can already start the *server*:" -msgstr "" +msgstr "이미 *서버*를 시작할 수 있습니다:" #: ../../source/example-jax-from-centralized-to-federated.rst:139 #: ../../source/tutorial-quickstart-jax.rst:145 @@ -2406,6 +2687,10 @@ msgid "" " *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`도 가져와야 합니다:" #: ../../source/example-jax-from-centralized-to-federated.rst:154 #: ../../source/tutorial-quickstart-jax.rst:160 @@ -2421,11 +2706,20 @@ msgid "" "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개의 메서드를 " +"구현해야 합니다:" #: ../../source/example-jax-from-centralized-to-federated.rst:161 #: ../../source/tutorial-quickstart-jax.rst:167 msgid ":code:`set_parameters (optional)`" -msgstr "" +msgstr ":code:`set_parameters (선택사항)`" #: ../../source/example-jax-from-centralized-to-federated.rst:160 #: ../../source/example-pytorch-from-centralized-to-federated.rst:219 @@ -2433,12 +2727,12 @@ msgstr "" msgid "" "set the model parameters on the local model that are received from the " "server" -msgstr "" +msgstr "서버에서 수신한 로컬 모델의 모델 파라미터를 설정합니다" #: ../../source/example-jax-from-centralized-to-federated.rst:161 #: ../../source/tutorial-quickstart-jax.rst:167 msgid "transform parameters to NumPy :code:`ndarray`'s" -msgstr "" +msgstr "매개 변수를 NumPy :code:`ndarray`로 변환" #: ../../source/example-jax-from-centralized-to-federated.rst:162 #: ../../source/example-pytorch-from-centralized-to-federated.rst:220 @@ -2446,7 +2740,8 @@ msgstr "" msgid "" "loop over the list of model parameters received as NumPy " ":code:`ndarray`'s (think list of neural network layers)" -msgstr "" +msgstr "(신경망 레이어 목록으로 생각하면 됩니다) NumPy :code:`ndarray`로 받은 모델 " +"파라미터 목록에 대해 반복합니다" #: ../../source/example-jax-from-centralized-to-federated.rst:163 #: ../../source/example-pytorch-from-centralized-to-federated.rst:221 @@ -2454,7 +2749,7 @@ msgstr "" #: ../../source/tutorial-quickstart-pytorch.rst:155 #: ../../source/tutorial-quickstart-scikitlearn.rst:118 msgid ":code:`get_parameters`" -msgstr "" +msgstr ":code:`get_parameters`" #: ../../source/example-jax-from-centralized-to-federated.rst:164 #: ../../source/example-pytorch-from-centralized-to-federated.rst:222 @@ -2463,6 +2758,8 @@ msgid "" "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`가 기대하는 바와 같습니다)" #: ../../source/example-jax-from-centralized-to-federated.rst:167 #: ../../source/example-pytorch-from-centralized-to-federated.rst:225 @@ -2470,7 +2767,7 @@ msgstr "" #: ../../source/tutorial-quickstart-pytorch.rst:161 #: ../../source/tutorial-quickstart-scikitlearn.rst:125 msgid ":code:`fit`" -msgstr "" +msgstr ":code:`fit`" #: ../../source/example-jax-from-centralized-to-federated.rst:166 #: ../../source/example-jax-from-centralized-to-federated.rst:170 @@ -2481,18 +2778,18 @@ msgstr "" msgid "" "update the parameters of the local model with the parameters received " "from the server" -msgstr "" +msgstr "서버에서 받은 파라미터로 로컬 모델의 파라미터를 업데이트합니다" #: ../../source/example-jax-from-centralized-to-federated.rst:167 #: ../../source/example-pytorch-from-centralized-to-federated.rst:225 #: ../../source/tutorial-quickstart-jax.rst:173 msgid "train the model on the local training set" -msgstr "" +msgstr "로컬 훈련 세트에서 모델을 훈련합니다" #: ../../source/example-jax-from-centralized-to-federated.rst:168 #: ../../source/tutorial-quickstart-jax.rst:174 msgid "get the updated local model parameters and return them to the server" -msgstr "" +msgstr "업데이트된 로컬 모델 파라미터를 가져와 서버로 반환합니다" #: ../../source/example-jax-from-centralized-to-federated.rst:172 #: ../../source/example-pytorch-from-centralized-to-federated.rst:230 @@ -2500,18 +2797,18 @@ msgstr "" #: ../../source/tutorial-quickstart-pytorch.rst:164 #: ../../source/tutorial-quickstart-scikitlearn.rst:128 msgid ":code:`evaluate`" -msgstr "" +msgstr ":code:`evaluate`" #: ../../source/example-jax-from-centralized-to-federated.rst:171 #: ../../source/example-pytorch-from-centralized-to-federated.rst:229 #: ../../source/tutorial-quickstart-jax.rst:177 msgid "evaluate the updated model on the local test set" -msgstr "" +msgstr "로컬 테스트 세트에서 업데이트된 모델을 평가합니다" #: ../../source/example-jax-from-centralized-to-federated.rst:172 #: ../../source/tutorial-quickstart-jax.rst:178 msgid "return the local loss to the server" -msgstr "" +msgstr "로컬 손실을 서버로 반환합니다" #: ../../source/example-jax-from-centralized-to-federated.rst:174 #: ../../source/tutorial-quickstart-jax.rst:180 @@ -2520,6 +2817,8 @@ msgid "" ":code:`DeviceArray` to :code:`NumPy ndarray` to make them compatible with" " `NumPyClient`." msgstr "" +"어려운 부분은 JAX 모델 매개변수를 :code:`DeviceArray`에서 :code:`NumPy " +"ndarray`로 변환하여 `NumPyClient`와 호환되도록 하는 것입니다." #: ../../source/example-jax-from-centralized-to-federated.rst:176 #: ../../source/tutorial-quickstart-jax.rst:182 @@ -2532,11 +2831,17 @@ msgid "" "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 "" +msgstr "federation 프로세스를 정의했으면 이제 실행할 수 있습니다." #: ../../source/example-jax-from-centralized-to-federated.rst:268 #: ../../source/example-pytorch-from-centralized-to-federated.rst:301 @@ -2551,6 +2856,8 @@ msgid "" "so) and see your JAX project run federated learning across two clients. " "Congratulations!" msgstr "" +"를 입력하고(그 전에 서버가 계속 실행 중인지 확인하세요) 두 클라이언트에서 " +"federated 학습을 실행하는 JAX 프로젝트를 확인합니다. 축하합니다!" #: ../../source/example-jax-from-centralized-to-federated.rst:279 #: ../../source/tutorial-quickstart-jax.rst:285 @@ -2560,6 +2867,10 @@ msgid "" "/quickstart-jax>`_. Our example is somewhat over-simplified because both " "clients load the same dataset." msgstr "" +"이 예제의 소스 코드는 시간이 지남에 따라 개선되었으며 여기에서 확인할 수 " +"있습니다: 'Quickstart JAX `_. 두 클라이언트가 동일한 데이터 세트를 로드하기 때문에 이 " +"예제는 다소 단순화되어 있습니다." #: ../../source/example-jax-from-centralized-to-federated.rst:282 #: ../../source/tutorial-quickstart-jax.rst:288 @@ -2568,10 +2879,13 @@ msgid "" " 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 "" +msgstr "예제: 파이토치 - 중앙 Centralized에서 Federated으로" #: ../../source/example-pytorch-from-centralized-to-federated.rst:4 msgid "" @@ -2584,6 +2898,13 @@ msgid "" "tutorial. Then, we build upon the centralized training code to run the " "training in a federated fashion." msgstr "" +"이 튜토리얼에서는 Flower를 사용해 기존 머신 러닝 워크로드의 federated 버전을 " +"구축하는 방법을 보여드립니다. 여기서는 PyTorch를 사용해 CIFAR-10 데이터 " +"세트에서 컨볼루션 신경망을 훈련합니다. 먼저, 'PyTorch로 딥 러닝 " +"`_ " +"튜토리얼을 기반으로 centralized 학습 접근 방식을 사용하여 이 머신 러닝 " +"작업을 소개합니다. 그런 다음 centralized 훈련 코드를 기반으로 federated 방식 " +"훈련을 실행합니다." #: ../../source/example-pytorch-from-centralized-to-federated.rst:12 msgid "" @@ -2592,6 +2913,10 @@ msgid "" "look at the official `PyTorch tutorial " "`_." msgstr "" +"centralized CNN 트레이닝 코드에 대한 간략한 설명부터 시작하겠습니다. 무슨 " +"일이 일어나고 있는지 더 자세히 설명하려면 공식 `PyTorch 튜토리얼 " +"`_을 " +"참조하세요." #: ../../source/example-pytorch-from-centralized-to-federated.rst:15 msgid "" @@ -2602,6 +2927,12 @@ msgid "" "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) 교육에 필요한 모든 구성 요소가 포함된 " +":code:`cifar.py`라는 새 파일을 생성해 보겠습니다. 먼저, 필요한 모든 " +"패키지(예: :code:`torch` 및 :code:`torchvision`)를 가져와야 합니다. " +"federated 학습을 위한 패키지를 가져오지 않는 것을 확인 할 수 있습니. 나중에 " +"federated 학습 구성 요소를 추가할 때에도 이러한 모든 가져오기를 그대로 " +"유지할 수 있습니다." #: ../../source/example-pytorch-from-centralized-to-federated.rst:32 msgid "" @@ -2609,12 +2940,17 @@ msgid "" "learning workload. The model architecture (a very simple Convolutional " "Neural Network) is defined in :code:`class Net()`." msgstr "" +"이미 언급했듯이 이 머신 러닝 워크로드에는 CIFAR-10 데이터 세트를 사용합니다. " +"모델 아키텍처(매우 간단한 컨볼루션 신경망)는 :code:`class Net()`에 정의되어 " +"있습니다." #: ../../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." msgstr "" +":code:`load_data()` 함수는 CIFAR-10 훈련 및 테스트 세트를 로드합니다. " +":code:`transform`은 로드 후 데이터를 정규화합니다." #: ../../source/example-pytorch-from-centralized-to-federated.rst:74 msgid "" @@ -2622,6 +2958,9 @@ msgid "" " over the training set, measures the loss, backpropagates it, and then " "takes one optimizer step for each batch of training examples." msgstr "" +"이제 학습 집합을 반복하고, 손실을 측정하고, 이를 역전파한 다음 각 학습 예제 " +"배치에 대해 하나의 최적화 단계를 수행하는 학습(함수 :code:`train()`)을 " +"정의해야 합니다." #: ../../source/example-pytorch-from-centralized-to-federated.rst:76 msgid "" @@ -2629,12 +2968,15 @@ msgid "" "The function loops over all test samples and measures the loss of the " "model based on the test dataset." msgstr "" +"모델 평가는 :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 "" @@ -2643,6 +2985,9 @@ msgid "" "simple federated learning system consisting of one server and two " "clients." msgstr "" +"지금까지는 파이토치를 사용해 본 적이 있다면 상당히 익숙하게 보일 것입니다. " +"다음 단계로 넘어가서 구축한 것을 사용하여 하나의 서버와 두 개의 클라이언트로 " +"구성된 간단한 연합 학습 시스템을 만들어 보겠습니다." #: ../../source/example-pytorch-from-centralized-to-federated.rst:169 msgid "" @@ -2654,12 +2999,19 @@ msgid "" "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 "" +msgstr "하지만 Flower를 사용하면 대대적인 재작성 없이도 기존 코드를 연합 학습 " +"설정으로 발전시킬 수 있습니다." #: ../../source/example-pytorch-from-centralized-to-federated.rst:175 msgid "" @@ -2671,6 +3023,12 @@ msgid "" "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 "" @@ -2679,6 +3037,10 @@ msgid "" "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 "" @@ -2693,18 +3055,27 @@ msgid "" "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개 등 네 " +"가지 메서드를 구현해야 합니다:" #: ../../source/example-pytorch-from-centralized-to-federated.rst:219 msgid ":code:`set_parameters`" -msgstr "" +msgstr ":code:`set_parameters`" #: ../../source/example-pytorch-from-centralized-to-federated.rst:226 msgid "get the updated local model weights and return them to the server" -msgstr "" +msgstr "업데이트된 로컬 모델 가중치를 가져와 서버로 반환합니다" #: ../../source/example-pytorch-from-centralized-to-federated.rst:230 msgid "return the local loss and accuracy to the server" -msgstr "" +msgstr "로컬 손실 및 정확도를 서버에 반환합니다" #: ../../source/example-pytorch-from-centralized-to-federated.rst:232 msgid "" @@ -2716,6 +3087,12 @@ msgid "" "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 "" @@ -2725,6 +3102,11 @@ msgid "" "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`를 시작합니다:" #: ../../source/example-pytorch-from-centralized-to-federated.rst:307 msgid "" @@ -2732,6 +3114,9 @@ msgid "" "and see your (previously centralized) PyTorch project run federated " "learning across two clients. Congratulations!" msgstr "" +"를 입력하고(그 전에 서버가 실행 중인지 확인하세요) (이전에는centralized) " +"PyTorch 프로젝트가 두 클라이언트에서 federated 학습을 실행하는 것을 " +"확인합니다. 축하합니다!" #: ../../source/example-pytorch-from-centralized-to-federated.rst:312 msgid "" @@ -2743,12 +3128,19 @@ msgid "" " 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 #: ../../source/tutorial-series-what-is-federated-learning.ipynb:303 msgid "Differential Privacy" -msgstr "" +msgstr "차분 프라이버시" #: ../../source/explanation-differential-privacy.rst:3 msgid "" @@ -2758,6 +3150,10 @@ msgid "" "data is also sensitive and there is a risk of compromising individual " "privacy." msgstr "" +"의료, 금융 거래, 사용자 선호도 등과 같은 데이터 세트의 정보는 가치 있고 " +"과학적 혁신의 잠재력을 지니고 있으며 중요한 비즈니스 인사이트를 제공합니다. " +"그러나 이러한 데이터는 또한 민감한 정보이며 개인의 프라이버시를 침해할 " +"위험이 있습니다." #: ../../source/explanation-differential-privacy.rst:6 msgid "" @@ -2766,6 +3162,9 @@ msgid "" "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 "" @@ -2776,10 +3175,15 @@ msgid "" "preserves group patterns while obscuring individual details, ensuring the" " individual's information remains hidden in the crowd." msgstr "" +"하나의 레코드(예: 앨리스의 데이터)를 제외하고는 동일한 두 개의 데이터 세트가 " +"있다고 상상해 보세요. 차분 프라이버(DP)는 평균 소득 계산과 같은 모든 분석(M)" +"이 두 데이터 세트에 대해 거의 동일한 결과를 산출하도록 보장합니다(O와 O' 는 " +"비슷할 것입니다). 이렇게 하면 그룹 패턴은 보존하면서 개별 세부 정보는 가려져 " +"개인의 정보가 군중 속에 숨겨집니다." #: ../../source/explanation-differential-privacy.rst:-1 msgid "DP Intro" -msgstr "" +msgstr "DP 소개" #: ../../source/explanation-differential-privacy.rst:22 msgid "" @@ -2788,10 +3192,13 @@ msgid "" "individual in the data while preserving the overall accuracy of the " "analysis." msgstr "" +"DP를 달성하기 위해 가장 일반적으로 사용되는 메커니즘 중 하나는 분석의 " +"전반적인 정확도를 유지하면서 데이터에서 각 개인의 기여도를 가릴 수 있도록 " +"분석 결과에 충분한 노이즈를 추가하는 것입니다." #: ../../source/explanation-differential-privacy.rst:25 msgid "Formal Definition" -msgstr "" +msgstr "공식 정의" #: ../../source/explanation-differential-privacy.rst:26 msgid "" @@ -2804,12 +3211,20 @@ msgid "" "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`)-차분 프라이버시를 제공합니다:" #: ../../source/explanation-differential-privacy.rst:32 msgid "" "\\small\n" "P[M(D_{1} \\in A)] \\leq e^{\\delta} P[M(D_{2} \\in A)] + \\delta" msgstr "" +"\\small\n" +"P[M(D_{1} \\in A)] \\leq e^{\\delta} P[M(D_{2} \\in A)] + \\delta" #: ../../source/explanation-differential-privacy.rst:38 msgid "" @@ -2822,10 +3237,17 @@ msgid "" "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`이 " +"적용되지 않는 작은 확률을 설명합니다. 차분 프라이버시를 달성하는 데 필요한 " +"노이즈의 양은 출력의 감도에 비례하며, 이는 단일 레코드의 포함 또는 제거로 " +"인한 출력의 최대 변화를 측정합니다." #: ../../source/explanation-differential-privacy.rst:45 msgid "Differential Privacy in Machine Learning" -msgstr "" +msgstr "머신 러닝의 차분 프라이버시" #: ../../source/explanation-differential-privacy.rst:46 msgid "" @@ -2841,10 +3263,18 @@ msgid "" "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 "" +msgstr "Federated 학습의 차분 프라이버시" #: ../../source/explanation-differential-privacy.rst:54 msgid "" @@ -2856,12 +3286,19 @@ msgid "" "membership inference and property inference attacks, or model inversion " "attacks." msgstr "" +"Federated 학습은 여러 당사자가 원시 데이터를 공유하지 않고도 공동으로 모델을 " +"학습할 수 있는 데이터 최소화 접근 방식입니다. 그러나 연합 학습은 새로운 " +"개인정보 보호 문제를 야기하기도 합니다. 당사자와 중앙 서버 간의 모델 " +"업데이트는 로컬 데이터에 대한 정보를 유출할 수 있습니다. 이러한 유출은 " +"멤버십 추론 및 속성 추론 공격이나 모델 반전 공격과 같은 공격에 악용될 수 " +"있습니다." #: ../../source/explanation-differential-privacy.rst:58 msgid "" "DP can play a crucial role in federated learning to provide privacy for " "the clients' data." -msgstr "" +msgstr "DP는 federated학습에서 클라이언트의 데이터에 대한 개인 정보 보호를 제공하는 " +"데 중요한 역할을 할 수 있습니다." #: ../../source/explanation-differential-privacy.rst:60 msgid "" @@ -2871,6 +3308,10 @@ msgid "" " 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를 활용하는 두 가지 접근 방식에 중점을 둡니다." #: ../../source/explanation-differential-privacy.rst:63 msgid "" @@ -2878,6 +3319,8 @@ msgid "" "goal is to prevent the aggregated model from leaking information about " "each client's data." msgstr "" +"**중앙 차분 프라이버시**: DP는 서버에서 적용되며 집계된 모델이 각 " +"클라이언트의 데이터에 대한 정보를 유출하는 것을 방지하는 것이 목표입니다." #: ../../source/explanation-differential-privacy.rst:65 msgid "" @@ -2886,12 +3329,15 @@ msgid "" "updates that are sent to the server from leaking any information about " "the client's data." msgstr "" +"**로컬 차분 개인정보 보호**: DP는 정보를 서버로 보내기 전에 클라이언트 " +"측에서 적용되며, 서버로 전송되는 업데이트가 클라이언트 데이터에 대한 정보를 " +"유출하는 것을 방지하는 것이 목표입니다." #: ../../source/explanation-differential-privacy.rst:-1 #: ../../source/explanation-differential-privacy.rst:68 #: ../../source/how-to-use-differential-privacy.rst:11 msgid "Central Differential Privacy" -msgstr "" +msgstr "중앙 차분 프라이버시" #: ../../source/explanation-differential-privacy.rst:69 msgid "" @@ -2899,6 +3345,9 @@ msgid "" "server is responsible for adding noise to the globally aggregated " "parameters. It should be noted that trust in the server is required." msgstr "" +"사용자 수준 DP라고도 하는 이 접근 방식에서는 중앙 서버가 전역적으로 집계된 " +"매개변수에 노이즈를 추가하는 역할을 담당합니다. 서버에 대한 신뢰가 " +"필요하다는 점에 유의해야 합니다." #: ../../source/explanation-differential-privacy.rst:76 msgid "" @@ -2914,10 +3363,20 @@ msgid "" " 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]에서 제안한 알고리즘에 집중합니다. 전반적인 접근 방식은 클라이언트가 " +"전송한 모델 업데이트를 잘라내고 집계된 모델에 약간의 노이즈를 추가하는 " +"것입니다. 각 반복에서 특정 확률로 훈련할 무작위 클라이언트 세트가 " +"선택됩니다. 각 클라이언트는 자체 데이터에 대해 로컬 학습을 수행합니다. 그런 " +"다음 각 클라이언트의 업데이트는 특정 값 `S`(민감도 `S`)에 의해 잘립니다. " +"이렇게 하면 개별 클라이언트의 영향을 제한할 수 있어 개인정보 보호에 중요하고 " +"견고성에 도움이 되는 경우가 많습니다. 이를 달성하기 위한 일반적인 접근 " +"방식은 클라이언트 모델 업데이트의 `L2` 규범을 제한하여 더 큰 업데이트가 규범 " +"`S`에 맞도록 축소되도록 하는 것입니다." #: ../../source/explanation-differential-privacy.rst:-1 msgid "clipping" -msgstr "" +msgstr "클리핑" #: ../../source/explanation-differential-privacy.rst:89 msgid "" @@ -2927,16 +3386,22 @@ msgid "" "mechanism is used with a noise sampled from `N (0, σ²)` where `σ = ( " "noise_scale * S ) / (number of sampled clients)`." msgstr "" +"그 후 가우시안 메커니즘을 사용하여 모든 클라이언트의 업데이트 합계를 " +"왜곡하기 위해 노이즈를 추가합니다. 노이즈의 양은 감도 값에 따라 조정되어 " +"프라이버시 보장을 얻습니다. 가우시안 메커니즘은 `N (0, σ²)`에서 샘플링된 " +"노이즈와 함께 사용됩니다. 여기서 `σ = (noise_scale * S) / (샘플링된 " +"클라이언트 수)`입니다." #: ../../source/explanation-differential-privacy.rst:94 msgid "Clipping" -msgstr "" +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 "" +msgstr "Central DP에서 일반적으로 사용되는 클리핑에는 고정 클리핑과 조정 클리핑의 두 " +"가지 형태가 있습니다." #: ../../source/explanation-differential-privacy.rst:98 msgid "" @@ -2944,6 +3409,9 @@ msgid "" "of clients' updates. Any update exceeding this threshold is clipped back " "to the threshold value." msgstr "" +"**고정 클리핑** : 클라이언트의 업데이트 크기에 대해 미리 정의된 고정 " +"임계값이 설정됩니다. 이 임계값을 초과하는 모든 업데이트는 임계값으로 다시 " +"클리핑됩니다." #: ../../source/explanation-differential-privacy.rst:100 msgid "" @@ -2952,19 +3420,23 @@ msgid "" " 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 " "others." -msgstr "" +msgstr "고정 클리핑과 조정 클리핑 중 선택은 개인정보 보호 요구 사항, 데이터 배포, " +"모델 복잡성 등 다양한 요인에 따라 달라집니다." #: ../../source/explanation-differential-privacy.rst:-1 #: ../../source/explanation-differential-privacy.rst:105 #: ../../source/how-to-use-differential-privacy.rst:96 msgid "Local Differential Privacy" -msgstr "" +msgstr "로컬 차분 프라이버시" #: ../../source/explanation-differential-privacy.rst:107 msgid "" @@ -2973,10 +3445,13 @@ msgid "" "that local DP leads to a decrease in accuracy but better privacy in " "comparison to central DP." msgstr "" +"이 접근 방식에서는 각 클라이언트가 DP를 수행할 책임이 있습니다. 로컬 DP는 " +"완전히 신뢰할 수 있는 애그리게이터가 필요하지 않지만, 로컬 DP는 중앙 DP에 " +"비해 정확도는 떨어져도 개인 정보 보호는 더 우수하다는 점에 유의해야 합니다." #: ../../source/explanation-differential-privacy.rst:116 msgid "In this explainer, we focus on two forms of achieving Local DP:" -msgstr "" +msgstr "이 설명에서는 로컬 DP를 달성하는 두 가지 형태에 중점을 둡니다:" #: ../../source/explanation-differential-privacy.rst:118 msgid "" @@ -2985,6 +3460,10 @@ msgid "" "the sensitivity of the local model to be ∆, Gaussian noise is applied " "with a noise scale of σ where:" msgstr "" +"각 클라이언트는 로컬 업데이트를 서버로 보내기 전에 로컬 업데이트에 노이즈를 " +"추가합니다. 로컬 모델의 감도를 ∆로 간주하여 가우시안 노이즈가 σ의 노이즈 " +"스케일로 적용되어 (:math:`\\epsilon`, :math:`\\delta`)-DP를 달성하기 위해, " +"여기서 σ는 노이즈 스케일입니다:" #: ../../source/explanation-differential-privacy.rst:120 msgid "" @@ -2993,6 +3472,10 @@ msgid "" "\\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" +"\n" #: ../../source/explanation-differential-privacy.rst:125 msgid "" @@ -3000,41 +3483,45 @@ 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에 주입됩니다." #: ../../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 msgid "**References:**" -msgstr "" +msgstr "**참고:**" #: ../../source/explanation-differential-privacy.rst:133 msgid "[1] Dwork et al. The Algorithmic Foundations of Differential Privacy." -msgstr "" +msgstr "[1] Dwork 외. 차분 프라이버시의 알고리즘적 기초." #: ../../source/explanation-differential-privacy.rst:135 msgid "" "[2] McMahan et al. Learning Differentially Private Recurrent Language " "Models." -msgstr "" +msgstr "[2] McMahan 외. 차분적 개인 반복 언어 모델 학습." #: ../../source/explanation-differential-privacy.rst:137 msgid "" "[3] Geyer et al. Differentially Private Federated Learning: A Client " "Level Perspective." -msgstr "" +msgstr "[3] Geyer 외. 차분적 개인 Federated 학습: 고객 수준의 관점." #: ../../source/explanation-differential-privacy.rst:139 msgid "[4] Galen et al. Differentially Private Learning with Adaptive Clipping." -msgstr "" +msgstr "[4] Galen 외. 조정형 클리핑을 통한 차분적 개인 학습." #: ../../source/explanation-federated-evaluation.rst:2 #: ../../source/tutorial-series-what-is-federated-learning.ipynb:292 msgid "Federated evaluation" -msgstr "" +msgstr "Federated 평가" #: ../../source/explanation-federated-evaluation.rst:4 msgid "" @@ -3042,14 +3529,17 @@ msgid "" "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 "" +msgstr "Centralized 평가" #: ../../source/explanation-federated-evaluation.rst:11 msgid "Built-In Strategies" -msgstr "" +msgstr "기본 제공 전략" #: ../../source/explanation-federated-evaluation.rst:13 msgid "" @@ -3058,10 +3548,13 @@ msgid "" "function that can take the current global model parameters as input and " "return evaluation results:" msgstr "" +"모든 기본 제공 전략은 초기화 중에 평가 함수를 제공하여 centralized 평가를 " +"지원합니다. 평가 함수는 현재 글로벌 모델 파라미터를 입력으로 받아 평가 " +"결과를 반환할 수 있는 모든 함수입니다:" #: ../../source/explanation-federated-evaluation.rst:58 msgid "Custom Strategies" -msgstr "" +msgstr "사용자 정의 전략" #: ../../source/explanation-federated-evaluation.rst:60 msgid "" @@ -3071,30 +3564,35 @@ msgid "" ":code:`evaluate` after parameter aggregation and before federated " "evaluation (see next paragraph)." msgstr "" +"코드:`전략` 추상화는 현재 전역 모델 파라미터를 평가하는 데 직접 사용할 수 " +"있는 :코드:`평가`라는 메서드를 제공합니다. 현재 서버 구현에서는 매개변수 " +"집계 후와 연합 평가 전에 :code:`evaluate`를 호출합니다(다음 단락 참조)." #: ../../source/explanation-federated-evaluation.rst:65 msgid "Federated Evaluation" -msgstr "" +msgstr "Federated 평가" #: ../../source/explanation-federated-evaluation.rst:68 msgid "Implementing Federated Evaluation" -msgstr "" +msgstr "Federated 평가 구현" #: ../../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 "" +msgstr "클라이언트 측 평가는 :code:`Client.evaluate` 메서드에서 이루어지며 서버 " +"측에서 구성할 수 있습니다." #: ../../source/explanation-federated-evaluation.rst:101 msgid "Configuring Federated Evaluation" -msgstr "" +msgstr "Federated 평가 구성" #: ../../source/explanation-federated-evaluation.rst:103 msgid "" "Federated evaluation can be configured from the server side. Built-in " "strategies support the following arguments:" -msgstr "" +msgstr "Federated 평가는 서버 측에서 구성할 수 있습니다. 기본 제공 전략은 다음 " +"인수를 지원합니다:" #: ../../source/explanation-federated-evaluation.rst:105 msgid "" @@ -3105,6 +3603,11 @@ msgid "" "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 "" @@ -3114,6 +3617,10 @@ msgid "" ":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` 클라이언트가 평가를 위해 선택됩니다." #: ../../source/explanation-federated-evaluation.rst:107 msgid "" @@ -3124,6 +3631,11 @@ msgid "" "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 "" @@ -3133,10 +3645,14 @@ msgid "" "client-side evaluation from the server side, for example, to configure " "the number of validation steps performed." msgstr "" +"code:`on_evaluate_config_fn`: 선택한 클라이언트로 전송할 구성 사전을 " +"반환하는 함수입니다. 이 함수는 각 단계 중에 호출되며, 서버 측에서 클라이언트 " +"측 평가를 사용자 지정하는 편리한 방법을 제공합니다(예: 수행되는 유효성 검사 " +"단계 수 구성)." #: ../../source/explanation-federated-evaluation.rst:135 msgid "Evaluating Local Model Updates During Training" -msgstr "" +msgstr "훈련 중 로컬 모델 업데이트 평가" #: ../../source/explanation-federated-evaluation.rst:137 msgid "" @@ -3144,10 +3660,12 @@ msgid "" ":code:`Client.fit` can return arbitrary evaluation results as a " "dictionary:" msgstr "" +"모델 파라미터는 훈련 중에도 평가할 수 있습니다. :code:`Client.fit`은 임의의 " +"평가 결과를 dictionary로 반환할 수 있습니다:" #: ../../source/explanation-federated-evaluation.rst:177 msgid "Full Code Example" -msgstr "" +msgstr "전체 코드 예제" #: ../../source/explanation-federated-evaluation.rst:179 msgid "" @@ -3156,79 +3674,83 @@ msgid "" "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" #: ../../source/fed/0000-20200102-fed-template.md:10 msgid "FED Template" -msgstr "" +msgstr "FED 템플릿" #: ../../source/fed/0000-20200102-fed-template.md:12 #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:12 msgid "Table of Contents" -msgstr "" +msgstr "목차" #: ../../source/fed/0000-20200102-fed-template.md:14 #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:14 msgid "[Table of Contents](#table-of-contents)" -msgstr "" +msgstr "[목차](#목차)" #: ../../source/fed/0000-20200102-fed-template.md:15 #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:15 msgid "[Summary](#summary)" -msgstr "" +msgstr "[요약](#요약)" #: ../../source/fed/0000-20200102-fed-template.md:16 #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:16 msgid "[Motivation](#motivation)" -msgstr "" +msgstr "[동기](#동기)" #: ../../source/fed/0000-20200102-fed-template.md:17 #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:17 msgid "[Goals](#goals)" -msgstr "" +msgstr "[목표](#목표)" #: ../../source/fed/0000-20200102-fed-template.md:18 #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:18 msgid "[Non-Goals](#non-goals)" -msgstr "" +msgstr "[비목표](#비목표)" #: ../../source/fed/0000-20200102-fed-template.md:19 #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:19 msgid "[Proposal](#proposal)" -msgstr "" +msgstr "[제안](#제안)" #: ../../source/fed/0000-20200102-fed-template.md:20 #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:23 msgid "[Drawbacks](#drawbacks)" -msgstr "" +msgstr "[단점](#단점)" #: ../../source/fed/0000-20200102-fed-template.md:21 #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:24 msgid "[Alternatives Considered](#alternatives-considered)" -msgstr "" +msgstr "[고려되는 대안](#고려되는 대안)" #: ../../source/fed/0000-20200102-fed-template.md:22 msgid "[Appendix](#appendix)" -msgstr "" +msgstr "[부록](#부록)" #: ../../source/fed/0000-20200102-fed-template.md:24 #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:28 #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:76 msgid "Summary" -msgstr "" +msgstr "요약" #: ../../source/fed/0000-20200102-fed-template.md:26 msgid "\\[TODO - sentence 1: summary of the problem\\]" -msgstr "" +msgstr "\\[TODO - 문장 1: 문제 요약\\]" #: ../../source/fed/0000-20200102-fed-template.md:28 msgid "\\[TODO - sentence 2: summary of the solution\\]" -msgstr "" +msgstr "\\[TODO - 문장 2: 솔루션 요약\\]" #: ../../source/fed/0000-20200102-fed-template.md:30 #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:47 #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:77 msgid "Motivation" -msgstr "" +msgstr "동기" #: ../../source/fed/0000-20200102-fed-template.md:32 #: ../../source/fed/0000-20200102-fed-template.md:36 @@ -3238,93 +3760,93 @@ msgstr "" #: ../../source/fed/0000-20200102-fed-template.md:54 #: ../../source/fed/0000-20200102-fed-template.md:58 msgid "\\[TODO\\]" -msgstr "" +msgstr "\\[TODO\\]" #: ../../source/fed/0000-20200102-fed-template.md:34 #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:53 #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:78 msgid "Goals" -msgstr "" +msgstr "목표" #: ../../source/fed/0000-20200102-fed-template.md:38 #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:59 #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:79 msgid "Non-Goals" -msgstr "" +msgstr "비목표" #: ../../source/fed/0000-20200102-fed-template.md:42 #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:65 #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:80 msgid "Proposal" -msgstr "" +msgstr "제안" #: ../../source/fed/0000-20200102-fed-template.md:46 #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:85 #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:129 msgid "Drawbacks" -msgstr "" +msgstr "단점" #: ../../source/fed/0000-20200102-fed-template.md:50 #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:86 #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:135 msgid "Alternatives Considered" -msgstr "" +msgstr "고려되는 대안" #: ../../source/fed/0000-20200102-fed-template.md:52 msgid "\\[Alternative 1\\]" -msgstr "" +msgstr "\\[대안 1\\]" #: ../../source/fed/0000-20200102-fed-template.md:56 msgid "\\[Alternative 2\\]" -msgstr "" +msgstr "\\[대안 2\\]" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:10 msgid "Flower Enhancement Doc" -msgstr "" +msgstr "Flower Enhancement Doc" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:20 msgid "[Enhancement Doc Template](#enhancement-doc-template)" -msgstr "" +msgstr "[Enhancement Doc 템플릿](#enhancement-doc-템플릿)" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:21 msgid "[Metadata](#metadata)" -msgstr "" +msgstr "[Metadata](#metadata)" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:22 msgid "[Workflow](#workflow)" -msgstr "" +msgstr "[워크플로우](#워크플로우)" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:25 msgid "[GitHub Issues](#github-issues)" -msgstr "" +msgstr "[GitHub Issues](#github-issues)" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:26 msgid "[Google Docs](#google-docs)" -msgstr "" +msgstr "[Google Docs](#google-docs)" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:30 msgid "A Flower Enhancement is a standardized development process to" -msgstr "" +msgstr "Flower Enhancement는 다음과 같은 표준화된 개발 프로세스입니다" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:32 msgid "provide a common structure for proposing larger changes" -msgstr "" +msgstr "더 큰 변경 사항을 제안하기 위한 공통 구조를 제공합니다" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:33 msgid "ensure that the motivation for a change is clear" -msgstr "" +msgstr "변화의 동기가 분명한지 확인합니다" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:34 msgid "persist project information in a version control system" -msgstr "" +msgstr "버전 관리 시스템에서 프로젝트 정보를 유지합니다" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:35 msgid "document the motivation for impactful user-facing changes" -msgstr "" +msgstr "사용자에게 영향력 있는 변화에 대한 동기를 문서화합니다" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:36 msgid "reserve GitHub issues for tracking work in flight" -msgstr "" +msgstr "운행 중 작업 추적을 위한 깃허브 이슈를 예약합니다" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:37 msgid "" @@ -3332,28 +3854,31 @@ msgid "" "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" -msgstr "" +msgstr "따라서 Enhancement 문서에는 다음과 같은 측면이 결합되어 있습니다" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:41 msgid "a feature, and effort-tracking document" -msgstr "" +msgstr "기능 및 effort-tracking 문서" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:42 msgid "a product requirements document" -msgstr "" +msgstr "제품 요구 사항 문서" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:43 msgid "a design document" -msgstr "" +msgstr "디자인 문서" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:45 msgid "" "into one file, which is created incrementally in collaboration with the " "community." -msgstr "" +msgstr "를 하나의 파일로 통합하여 커뮤니티와 협력해 점진적으로 생성합니다." #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:49 msgid "" @@ -3361,6 +3886,9 @@ msgid "" "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이 필요합니다." #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:51 msgid "" @@ -3369,6 +3897,10 @@ msgid "" "video calls, and hallway conversations into a well-tracked artifact, this" " process aims to enhance communication and discoverability." msgstr "" +"이 프로세스의 목적은 커뮤니티 내 '부족한 지식'의 양을 줄이는 것입니다. 이 " +"프로세스는 Slack 스레드, 영상 통화, 복도 대화에서 나온 의사 결정을 잘 추적된 " +"아티팩트로 옮김으로써 커뮤니케이션과 검색 가능성을 향상시키는 것을 목표로 " +"합니다." #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:55 msgid "" @@ -3377,6 +3909,9 @@ msgid "" "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 "" @@ -3385,6 +3920,9 @@ msgid "" "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 "" @@ -3393,13 +3931,18 @@ msgid "" "adding new Federated Learning algorithms, as these only add features " "without changing how Flower works or is used." msgstr "" +"작은 변경 및 추가의 경우, 개선 프로세스를 거치는 것은 시간이 많이 걸리고 " +"불필요합니다. 예를 들어, 새로운 Federated 학습 알고리즘을 추가하는 것은 " +"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 "" +msgstr "기능 개선은 이미 구현할 수 있는 경로가 마련되어 있고 커뮤니티 구성원들이 " +"지지하는 것이므로 기능 요청과는 다릅니다." #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:67 msgid "" @@ -3407,105 +3950,110 @@ msgid "" "template and a workflow to review and store enhancement docs for " "reference — the Enhancement Doc." msgstr "" +"개선 사항은 정의된 템플릿과 참조용으로 Enhancement Doc.를 검토하고 저장하는 " +"워크플로우를 따르는 Markdown 파일에 캡처됩니다." #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:69 msgid "Enhancement Doc Template" -msgstr "" +msgstr "Enhancement Doc 템플릿" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:71 msgid "" "Each enhancement doc is provided as a Markdown file having the following " "structure" -msgstr "" +msgstr "각 개선 사항 문서는 다음과 같은 구조의 Markdown 파일로 제공됩니다" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:73 msgid "Metadata (as [described below](#metadata) in form of a YAML preamble)" -msgstr "" +msgstr "Metadata ([아래 설명](#metadata) YAML preamble 형식)" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:74 msgid "Title (same as in metadata)" -msgstr "" +msgstr "Title (metadata와 같게)" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:75 msgid "Table of Contents (if needed)" -msgstr "" +msgstr "Table of Contents (필요시)" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:81 msgid "Notes/Constraints/Caveats (optional)" -msgstr "" +msgstr "Notes/Constraints/Caveats (선택 사항)" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:82 msgid "Design Details (optional)" -msgstr "" +msgstr "Design Details (선택 사항)" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:83 msgid "Graduation Criteria" -msgstr "" +msgstr "졸업 기준" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:84 msgid "Upgrade/Downgrade Strategy (if applicable)" -msgstr "" +msgstr "업그레이드/다운그레이드 전략(해당되는 경우)" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:88 msgid "As a reference, this document follows the above structure." -msgstr "" +msgstr "참고로 이 문서는 위의 구조를 따릅니다." #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:90 #: ../../source/ref-api/flwr.common.Metadata.rst:2 msgid "Metadata" -msgstr "" +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." msgstr "" +"**피드 번호** (필수) 마지막 Flower Enhancement 문서의 `피드 번호` + 1. 이 " +"번호를 사용하면 다른 제안을 쉽게 참조할 수 있습니다." #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:94 msgid "**title** (Required) The title of the proposal in plain language." -msgstr "" +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 "" +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." -msgstr "" +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." -msgstr "" +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." -msgstr "" +msgstr "**함께 보기** (선택 사항) 이 제안과 관련된 다른 제안 목록입니다." #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:106 msgid "**replaces** (Optional) A list of proposals that this one replaces." -msgstr "" +msgstr "**대체** (선택 사항) 이 제안이 대체하는 제안 목록입니다." #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:108 msgid "**superseded-by** (Optional) A list of proposals that this one supersedes." -msgstr "" +msgstr "**대체됨** (선택 사항) 이 제안이 대체하는 제안의 목록입니다." #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:111 msgid "Workflow" -msgstr "" +msgstr "워크플로우" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:113 msgid "" @@ -3514,6 +4062,9 @@ msgid "" "author, who shepherds the enhancement. This person also has to find " "committers to Flower willing to review the proposal." msgstr "" +"개선 사항을 구성하는 아이디어는 이미 커뮤니티에서 논의되었거나 제안된 적이 " +"있어야 합니다. 따라서 개선 사항을 주도하는 사(보통 작성자)이 필요합니다. 이 " +"사람은 또한 제안을 검토할 의향이 있는 Flower 커미터를 찾아야 합니다." #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:115 msgid "" @@ -3523,6 +4074,10 @@ msgid "" "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 검토의 일부로 이루어집니다." #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:117 msgid "" @@ -3532,12 +4087,16 @@ msgid "" "enhancement as part of their description. After the implementation is " "done, the proposal status is changed to `implemented`." msgstr "" +"개선 사항이 검토 및 승인되면 상태가 '구현 가능'으로 변경됩니다. 그런 다음 " +"실제 구현은 별도의 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 "" +msgstr "특정 조건에서는 다른 상태도 가능합니다. 개선에는 다음과 같은 상태가 있습니다:" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:121 msgid "" @@ -3545,34 +4104,37 @@ msgid "" "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." -msgstr "" +msgstr "`구현 가능`: 개선 사항이 검토 및 승인되었습니다." #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:123 msgid "" "`implemented`: The enhancement has been implemented and is no longer " "actively changed." -msgstr "" +msgstr "`구현됨`: 개선 사항이 구현되었으며 더 이상 활발히 변경되지 않습니다." #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:124 msgid "`deferred`: The enhancement is proposed but not actively being worked on." -msgstr "" +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 "" +msgstr "`거부됨`: 작성자와 검토자는 이 개선 사항을 더 이상 진행하지 않기로 " +"결정했습니다." #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:126 msgid "`withdrawn`: The authors have withdrawn the enhancement." -msgstr "" +msgstr "`철회`: 작성자가 개선 사항을 철회했습니다." #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:127 msgid "`replaced`: The enhancement has been replaced by a new enhancement." -msgstr "" +msgstr "'대체됨': 개선 사항이 새로운 개선 사항으로 대체되었습니다." #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:131 msgid "" @@ -3580,6 +4142,8 @@ msgid "" "(Issues and Pull Requests) adds more complexity and can be a barrier for " "potential first-time contributors." msgstr "" +"GitHub에서 이미 제공하는 프로세스(이슈 및 Pull Requests)에 추가 프로세스를 " +"추가하면 더 복잡해지고 잠재적인 처음인 기여자에게는 장벽이 될 수 있습니다." #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:133 msgid "" @@ -3587,10 +4151,12 @@ msgid "" "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" -msgstr "" +msgstr "GitHub 이슈" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:139 msgid "" @@ -3602,10 +4168,16 @@ msgid "" "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" -msgstr "" +msgstr "Google 문서 도구" #: ../../source/fed/0001-20220311-flower-enhancement-doc.md:143 msgid "" @@ -3616,24 +4188,29 @@ msgid "" "proposals as part of Flower's repository, the potential for missing links" " is much higher." msgstr "" +"Google 문서는 여러 스레드의 토론을 허용합니다. 하지만 Google 문서는 프로젝트 " +"외부에서 호스팅되므로 커뮤니티에서 검색할 수 있도록 관리해야 합니다. 모든 " +"제안에 대한 링크 목록을 관리하고 커뮤니티에 제공해야 합니다. Flower 저장소의 " +"일부로 제안서를 보낼 때와 비교하면 링크가 누락될 가능성이 훨씬 더 높습니다." #: ../../source/fed/index.md:1 msgid "FED - Flower Enhancement Doc" -msgstr "" +msgstr "FED - Flower 개선 문서" #: ../../source/how-to-aggregate-evaluation-results.rst:2 msgid "Aggregate evaluation results" -msgstr "" +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 "" +msgstr "Flower 서버는 평가 결과를 집계하는 방법을 규정하고 있지 않지만 사용자가 결과 " +"집계를 완전히 사용자 지정할 수 있습니다." #: ../../source/how-to-aggregate-evaluation-results.rst:8 msgid "Aggregate Custom Evaluation Results" -msgstr "" +msgstr "사용자 지정 평가 결과 집계" #: ../../source/how-to-aggregate-evaluation-results.rst:10 msgid "" @@ -3641,16 +4218,20 @@ msgid "" " custom evaluation results coming from individual clients. Clients can " "return custom metrics to the server by returning a dictionary:" msgstr "" +"동일한 :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 "" +msgstr "그런 다음 서버는 사용자 지정 전략을 사용하여 이러한 dictionaries에서 " +"제공하는 메트릭을 집계할 수 있습니다:" #: ../../source/how-to-authenticate-supernodes.rst:2 msgid "Authenticate SuperNodes" -msgstr "" +msgstr "SuperNodes 인증하기" #: ../../source/how-to-authenticate-supernodes.rst:4 msgid "" @@ -3659,26 +4240,30 @@ msgid "" "Flower node authentication works similar to how GitHub SSH authentication" " works:" msgstr "" +"Flower는 SuperLink에 연결하는 각 SuperNodes의 신원을 확인하는 데 사용할 수 " +"있는 인증된 SuperNodes에 대한 기본 지원을 제공합니다. Flower 노드 인증은 " +"GitHub SSH 인증 방식과 유사하게 작동합니다:" #: ../../source/how-to-authenticate-supernodes.rst:7 msgid "SuperLink (server) stores a list of known (client) node public keys" -msgstr "" +msgstr "SuperLink(서버)는 알려진 (클라이언트) 노드 공개키 목록을 저장합니다" #: ../../source/how-to-authenticate-supernodes.rst:8 msgid "" "Using ECDH, both SuperNode and SuperLink independently derive a shared " "secret" -msgstr "" +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 "" +msgstr "비밀 공유는 SuperNode에서 SuperLink로 토큰으로 전송된 메시지의 HMAC 값을 " +"계산하는 데 사용됩니다" #: ../../source/how-to-authenticate-supernodes.rst:10 msgid "SuperLink verifies the token" -msgstr "" +msgstr "SuperLink가 토큰을 확인합니다" #: ../../source/how-to-authenticate-supernodes.rst:12 msgid "" @@ -3687,22 +4272,27 @@ msgid "" "authentication>`_ demonstrating federated learning with Flower in an " "authenticated setting." msgstr "" +"인증된 환경에서 Flower로 federated 학습을 시연하는 전체 '코드 예제 " +"`" +"_를 확인하는 것이 좋습니다." #: ../../source/how-to-authenticate-supernodes.rst:15 msgid "" "This guide covers a preview feature that might change in future versions " "of Flower." -msgstr "" +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 "" +msgstr "보안을 강화하기 위해 노드 인증은 암호화된 연결(SSL/TLS)을 사용하도록 설정한 " +"경우에만 사용할 수 있습니다." #: ../../source/how-to-authenticate-supernodes.rst:21 msgid "Enable node authentication in :code:`SuperLink`" -msgstr "" +msgstr ":code:`SuperLink`에서 노드 인증 활성화" #: ../../source/how-to-authenticate-supernodes.rst:23 msgid "" @@ -3715,10 +4305,16 @@ msgid "" ":code:`SuperNode` that has both secure connections and node " "authentication enabled:" msgstr "" +"노드 인증을 활성화하려면 먼저 SuperLink<>SuperNode 통신을 보호하기 위해 SSL/" +"TLS 연결을 구성해야 합니다. 전체 가이드는 `여기 `_에서 확인할 수 있습니다. 보안 " +"연결을 구성한 후, 장기 실행하는 Flower :code:`SuperLink`에서 클라이언트 " +"인증을 활성화할 수 있습니다. 다음 터미널 명령을 사용하여 보안 연결과 노드 " +"인증이 모두 활성화된 Flower :code:`SuperNode`를 시작하세요:" #: ../../source/how-to-authenticate-supernodes.rst:38 msgid "Let's break down the authentication flags:" -msgstr "" +msgstr "인증 플래그를 세분화해 보겠습니다:" #: ../../source/how-to-authenticate-supernodes.rst:40 msgid "" @@ -3727,6 +4323,9 @@ msgid "" " 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`)에 저장해야 합니다." #: ../../source/how-to-authenticate-supernodes.rst:42 msgid "" @@ -3735,6 +4334,9 @@ msgid "" "example, refer to our code sample, which contains a CSV file with two " "known node public keys." msgstr "" +"알려진 노드 공개키를 저장하는 유효한 CSV 파일은 쉼표로 구분하고 주석 없이 " +"OpenSSH 형식으로 키를 나열해야 합니다. 예를 들어, 두 개의 알려진 노드 " +"공개키가 포함된 CSV 파일이 포함된 코드 샘플을 참조하세요." #: ../../source/how-to-authenticate-supernodes.rst:44 msgid "" @@ -3743,6 +4345,10 @@ msgid "" "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`를 사용하여 개인 및 공개 키 " +"쌍을 생성할 수 있습니다." #: ../../source/how-to-authenticate-supernodes.rst:47 msgid "" @@ -3752,10 +4358,15 @@ msgid "" "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월)에서 로드맵에 " +"포함되어 있습니다." #: ../../source/how-to-authenticate-supernodes.rst:53 msgid "Enable node authentication in :code:`SuperNode`" -msgstr "" +msgstr ":code:`SuperNode`에서 노드 인증을 활성화합니다" #: ../../source/how-to-authenticate-supernodes.rst:55 msgid "" @@ -3764,6 +4375,9 @@ msgid "" "(:code:`SuperNode`). Use the following terminal command to start an " "authenticated :code:`SuperNode`:" msgstr "" +"장기 실행 중인 Flower 서버(:code:`SuperLink`)와 마찬가지로, 장기 실행 중인 " +"Flower 클라이언트(:code:`SuperNode`)에서도 노드 인증을 쉽게 활성화할 수 " +"있습니다. 다음 터미널 명령을 사용하여 인증된 :code:`SuperNode`를 시작하세요:" #: ../../source/how-to-authenticate-supernodes.rst:66 msgid "" @@ -3773,10 +4387,14 @@ msgid "" "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`를 사용하여 개인 " +"및 공개 키 쌍을 생성할 수 있습니다." #: ../../source/how-to-authenticate-supernodes.rst:70 msgid "Security notice" -msgstr "" +msgstr "보안 공지" #: ../../source/how-to-authenticate-supernodes.rst:72 msgid "" @@ -3788,13 +4406,18 @@ msgid "" "communication is done in a secure manner, using trusted communication " "methods." msgstr "" +"시스템의 보안은 SuperLink와 각SuperNode의 자격 증명에 의존합니다. 따라서 " +"공개키 기반구조(PKI) 사칭 공격과 같은 보안 위험을 피하기 위해 자격 증명을 " +"보호하고 안전하게 보관하는 것이 필수적입니다. 노드 인증 메커니즘에는 사람의 " +"상호 작용도 포함되므로 모든 통신이 신뢰할 수 있는 통신 방법을 사용하여 " +"안전한 방식으로 이루어지도록 하세요." #: ../../source/how-to-authenticate-supernodes.rst:77 #: ../../source/how-to-enable-ssl-connections.rst:68 #: ../../source/how-to-use-built-in-mods.rst:85 #: ../../source/tutorial-series-what-is-federated-learning.ipynb:287 msgid "Conclusion" -msgstr "" +msgstr "결론" #: ../../source/how-to-authenticate-supernodes.rst:79 msgid "" @@ -3803,10 +4426,14 @@ msgid "" "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`)를 시작하는 방법을 " +"배웠을 것입니다. 또한 보안 위험을 최소화하기 위해 개인키의 중요성을 알고 " +"안전하게 보관해야 합니다." #: ../../source/how-to-configure-clients.rst:2 msgid "Configure clients" -msgstr "" +msgstr "클라이언트 구성" #: ../../source/how-to-configure-clients.rst:4 msgid "" @@ -3815,10 +4442,13 @@ msgid "" " for example, a popular way to control client-side hyperparameters from " "the server." msgstr "" +"모델 파라미터와 함께 Flower는 설정 값을 클라이언트에 전송할 수 있습니다. " +"구성 값은 다양한 용도로 사용할 수 있습니다. 예를 들어 서버에서 클라이언트 측 " +"하이퍼파라미터를 제어하는 데 널리 사용되는 방법입니다." #: ../../source/how-to-configure-clients.rst:7 msgid "Configuration values" -msgstr "" +msgstr "구성 값" #: ../../source/how-to-configure-clients.rst:9 msgid "" @@ -3827,6 +4457,9 @@ msgid "" "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의 구성 사전 예제입니다:" #: ../../source/how-to-configure-clients.rst:20 msgid "" @@ -3834,6 +4467,9 @@ msgid "" "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 " +"dictionaries로 역직렬화합니다." #: ../../source/how-to-configure-clients.rst:24 msgid "" @@ -3843,6 +4479,10 @@ msgid "" " 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 "" @@ -3851,10 +4491,13 @@ msgid "" " then convert the JSON string back to a list of floating-point numbers on" " the client." msgstr "" +"예를 들어 부동 소수점 숫자 목록을 JSON 문자열로 변환한 다음 구성 " +"dictionary을 사용하여 JSON 문자열을 전송한 다음 클라이언트에서 다시 부동 " +"소수점 숫자 목록으로 변환할 수 있습니다." #: ../../source/how-to-configure-clients.rst:30 msgid "Configuration through built-in strategies" -msgstr "" +msgstr "기본 제공 전략을 통한 구성" #: ../../source/how-to-configure-clients.rst:32 msgid "" @@ -3865,6 +4508,11 @@ msgid "" "the current round. It then forwards the configuration dictionary to all " "the clients selected during that round." msgstr "" +"클라이언트에 구성 값을 보내는 가장 쉬운 방법은 :code:`FedAvg`와 같은 기본 " +"제공 전략을 사용하는 것입니다. 기본 제공 전략은 소위 구성 함수를 지원합니다. " +"구성 함수는 내장 전략이 현재 단계의 구성 사전을 가져오기 위해 호출하는 " +"함수입니다. 그런 다음 해당 단계 동안 선택된 모든 클라이언트에 구성 사전을 " +"전달합니다." #: ../../source/how-to-configure-clients.rst:34 msgid "" @@ -3873,6 +4521,9 @@ msgid "" "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) 클라이언트 측에서 학습할 에포크 수를 " +"전송하고 싶다고 가정해 보겠습니다. 구성 함수는 다음과 같습니다:" #: ../../source/how-to-configure-clients.rst:47 msgid "" @@ -3880,10 +4531,12 @@ msgid "" "``FedAvg`` during initialization using the parameter " ":code:`on_fit_config_fn`:" msgstr "" +"기본 제공 전략이 이 함수를 사용하도록 하려면 초기화 중에 매개 변수 " +":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``:" -msgstr "" +msgstr "클라이언트 측에서는 ``fit``으로 구성 dictionary을 받습니다:" #: ../../source/how-to-configure-clients.rst:67 msgid "" @@ -3892,6 +4545,9 @@ msgid "" " send different configuration values to `evaluate` (for example, to use a" " different batch size)." msgstr "" +"평가를 구성하는 `on_evaluate_config_fn`도 있으며, 같은 방식으로 작동합니다. " +"다른 배치 크기를 사용하기 위해 다른 구성 값을 `evaluate`로 보내려고 할 수 " +"있기 때문에 이 함수는 별도의 함수입니다." #: ../../source/how-to-configure-clients.rst:69 msgid "" @@ -3902,20 +4558,25 @@ msgid "" "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를 변경/변경할 수 있습니다. 예를 들어 이후 라운드에서 로컬 에포크 수를 " +"늘리기 위해 하이퍼파라미터 일정을 구현하려면 다음과 같이 할 수 있습니다:" #: ../../source/how-to-configure-clients.rst:82 msgid "The :code:`FedAvg` strategy will call this function *every round*." -msgstr "" +msgstr ":code:`FedAvg` 전략은 이 함수를 *매 라운드마다* 호출합니다." #: ../../source/how-to-configure-clients.rst:85 msgid "Configuring individual clients" -msgstr "" +msgstr "개별 클라이언트 구성" #: ../../source/how-to-configure-clients.rst:87 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 "" @@ -3927,10 +4588,16 @@ msgid "" "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에 추가합니다(목록의 첫 번째 클라이언트만, 이 라운드의 다른 클라이언트는 " +"이 \"특별한\" 구성 값을 수신하지 않음):" #: ../../source/how-to-configure-logging.rst:2 msgid "Configure logging" -msgstr "" +msgstr "로깅 구성" #: ../../source/how-to-configure-logging.rst:4 msgid "" @@ -3938,6 +4605,8 @@ msgid "" "federated learning workloads. It presents information by default " "following a standard message format:" msgstr "" +"Flower 로거는 federated 학습 워크로드에서 발생하는 모든 핵심 이벤트를 " +"추적합니다. 기본적으로 표준 메시지 형식에 따라 정보를 표시합니다:" #: ../../source/how-to-configure-logging.rst:13 msgid "" @@ -3946,10 +4615,13 @@ msgid "" "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" -msgstr "" +msgstr "파일에 로그 저장" #: ../../source/how-to-configure-logging.rst:36 msgid "" @@ -3963,6 +4635,14 @@ msgid "" "`_" " 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 "" @@ -3971,10 +4651,14 @@ msgid "" "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` 접두사가 " +"붙는 것을 확인할 수 있습니다:" #: ../../source/how-to-configure-logging.rst:74 msgid "Log your own messages" -msgstr "" +msgstr "나만의 메시지 기록" #: ../../source/how-to-configure-logging.rst:76 msgid "" @@ -3982,16 +4666,19 @@ msgid "" "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 "" +msgstr "이렇게 하면 로거에 기본 메시지 외에 위에서 지정한 대로 클라이언트가 소개한 " +"메시지가 표시됩니다." #: ../../source/how-to-configure-logging.rst:128 msgid "Log to a remote service" -msgstr "" +msgstr "원격 서비스에 로그인" #: ../../source/how-to-configure-logging.rst:130 msgid "" @@ -4005,10 +4692,17 @@ msgid "" ":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" -msgstr "" +msgstr "SSL 연결 사용" #: ../../source/how-to-enable-ssl-connections.rst:4 msgid "" @@ -4016,6 +4710,9 @@ msgid "" "(: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`)가 이 서버에 보안 연결을 " +"설정하는 방법을 설명합니다." #: ../../source/how-to-enable-ssl-connections.rst:7 msgid "" @@ -4023,6 +4720,8 @@ msgid "" "`here `_." msgstr "" +"보안 연결을 보여주는 전체 코드 예제는 '여기 `_'에서 확인할 수 있습니다." #: ../../source/how-to-enable-ssl-connections.rst:10 msgid "" @@ -4031,10 +4730,13 @@ msgid "" "descriptive on how it does so. Stick to this guide for a deeper " "introduction to the topic." msgstr "" +"코드 예제에는 시작 방법을 설명하는 :code:`README.md` 파일이 함께 제공됩니다. " +"이미 SSL을 사용하도록 설정되어 있지만 그 방법에 대한 설명이 부족할 수 " +"있습니다. 이 가이드를 참고하여 이 주제에 대해 자세히 알아보세요." #: ../../source/how-to-enable-ssl-connections.rst:16 msgid "Certificates" -msgstr "" +msgstr "인증서" #: ../../source/how-to-enable-ssl-connections.rst:18 msgid "" @@ -4044,12 +4746,18 @@ msgid "" "to ask you to run the script in :code:`examples/advanced-" "tensorflow/certificates/generate.sh` with the following command sequence:" msgstr "" +"SSL 사용 연결을 사용하려면 서버와 클라이언트에 인증서를 전달해야 합니다. 이 " +"가이드에서는 자체 서명된 인증서를 생성하겠습니다. 이 과정은 상당히 복잡할 수 " +"있으므로 다음 명령 시퀀스를 사용하여 :code:`examples/advanced-tensorflow/" +"certificates/generate.sh`에서 스크립트를 실행하도록 요청하겠습니다:" #: ../../source/how-to-enable-ssl-connections.rst:29 msgid "" "This will generate the certificates in :code:`examples/advanced-" "tensorflow/.cache/certificates`." msgstr "" +"이렇게 하면 :code:`examples/advanced-tensorflow/.cache/certificates`에 " +"인증서가 생성됩니다." #: ../../source/how-to-enable-ssl-connections.rst:31 msgid "" @@ -4061,39 +4769,48 @@ msgid "" "projects, it might be sufficient to use the self-signed certificates " "generated using the scripts mentioned in this guide." msgstr "" +"이 예의 맥락에서 SSL 인증서를 생성하는 접근 방식은 영감과 출발점이 될 수 " +"있지만 프로덕션 환경에 대한 참조로 사용해서는 안 됩니다. 프로덕션 환경용 " +"인증서를 올바르게 생성하는 문제에 대해서는 다른 출처를 참조하세요. 중요하지 " +"않은 프로토타이핑 또는 연구 프로젝트의 경우, 이 가이드에 언급된 스크립트를 " +"사용하여 생성한 자체 서명 인증서를 사용하는 것으로 충분할 수 있습니다." #: ../../source/how-to-enable-ssl-connections.rst:39 msgid "Server (SuperLink)" -msgstr "" +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 "" +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 "" +msgstr "인증서를 제공할 때 서버는 세 가지 인증서 경로의 튜플을 기대합니다: CA " +"인증서, 서버 인증서 및 서버 개인 키입니다." #: ../../source/how-to-enable-ssl-connections.rst:54 msgid "Client (SuperNode)" -msgstr "" +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 "" +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 "" +msgstr "코드:`root_certificates`를 설정하면 클라이언트는 PEM 인코딩된 루트 인증서의 " +"파일 경로를 예상합니다." #: ../../source/how-to-enable-ssl-connections.rst:70 msgid "" @@ -4101,28 +4818,30 @@ msgid "" "using the given script, start an SSL-enabled server and have a client " "establish a secure connection to it." msgstr "" +"이제 주어진 스크립트를 사용하여 자체 서명 인증서를 생성하고, SSL 사용 서버를 " +"시작하고, 클라이언트가 보안 연결을 설정하는 방법을 배웠을 것입니다." #: ../../source/how-to-enable-ssl-connections.rst:75 msgid "Additional resources" -msgstr "" +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:" -msgstr "" +msgstr "인증서에 대해 더 자세히 알아보고 싶다면 이러한 추가 자료를 참고하세요:" #: ../../source/how-to-enable-ssl-connections.rst:79 msgid "`Let's Encrypt `_" -msgstr "" +msgstr "'암호화하세요 `_'" #: ../../source/how-to-enable-ssl-connections.rst:80 msgid "`certbot `_" -msgstr "" +msgstr "인증봇 `_" #: ../../source/how-to-implement-strategies.rst:2 msgid "Implement strategies" -msgstr "" +msgstr "전략 구현" #: ../../source/how-to-implement-strategies.rst:4 msgid "" @@ -4133,10 +4852,15 @@ msgid "" "evaluate models. Flower provides a few built-in strategies which are " "based on the same API described below." msgstr "" +"전략 추상화를 통해 완전한 맞춤형 전략을 구현할 수 있습니다. 전략은 " +"기본적으로 서버에서 실행되는 federated 학습 알고리즘입니다. 전략은 " +"클라이언트를 샘플링하는 방법, 학습을 위해 클라이언트를 구성하는 방법, " +"업데이트를 집계하는 방법, 모델을 평가하는 방법을 결정합니다. Flower는 아래에 " +"설명된 것과 동일한 API를 기반으로 하는 몇 가지 기본 제공 전략을 제공합니다." #: ../../source/how-to-implement-strategies.rst:11 msgid "The :code:`Strategy` abstraction" -msgstr "" +msgstr ":code:`Strategy` 추상화" #: ../../source/how-to-implement-strategies.rst:13 msgid "" @@ -4146,12 +4870,15 @@ msgid "" "implementations have the exact same capabilities at their disposal as " "built-in ones." msgstr "" +"모든 전략 구현은 기본 제공 구현과 타사 구현 모두 추상 기본 클래스인 " +":code:`flwr.server.strategy.Strategy`에서 파생됩니다. 즉, 사용자 정의 전략 " +"구현은 기본 제공 구현과 완전히 동일한 기능을 사용할 수 있습니다." #: ../../source/how-to-implement-strategies.rst:18 msgid "" "The strategy abstraction defines a few abstract methods that need to be " "implemented:" -msgstr "" +msgstr "전략 추상화에서는 구현해야 하는 몇 가지 추상적인 메서드를 정의합니다:" #: ../../source/how-to-implement-strategies.rst:75 msgid "" @@ -4159,18 +4886,21 @@ msgid "" "from the abstract base class :code:`Strategy`) that implements for the " "previously shown abstract methods:" msgstr "" +"새 전략을 생성한다는 것은 이전에 표시된 추상 메서드에 대해 구현하는 새로운 " +":code:`class`(추상 기본 클래스 :code:`Strategy`에서 파생됨)를 구현하는 것을 " +"의미합니다:" #: ../../source/how-to-implement-strategies.rst:100 msgid "The Flower server calls these methods in the following order:" -msgstr "" +msgstr "Flower 서버는 다음 순서로 이러한 메서드를 호출합니다:" #: ../../source/how-to-implement-strategies.rst:177 msgid "The following sections describe each of those methods in more detail." -msgstr "" +msgstr "다음 섹션에서는 이러한 각 방법에 대해 자세히 설명합니다." #: ../../source/how-to-implement-strategies.rst:180 msgid "The :code:`initialize_parameters` method" -msgstr "" +msgstr ":code:`initialize_parameters` 메서드" #: ../../source/how-to-implement-strategies.rst:182 msgid "" @@ -4178,6 +4908,9 @@ msgid "" "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` 객체)" +"으로 제공하는 역할을 합니다." #: ../../source/how-to-implement-strategies.rst:184 msgid "" @@ -4185,6 +4918,8 @@ msgid "" "following example shows how initial parameters can be passed to " ":code:`FedAvg`:" msgstr "" +"기본 제공 전략은 사용자가 제공한 초기 매개 변수를 반환합니다. 다음 예는 초기 " +"매개 변수를 :code:`FedAvg`에 전달하는 방법을 보여줍니다:" #: ../../source/how-to-implement-strategies.rst:209 msgid "" @@ -4197,6 +4932,13 @@ msgid "" "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 "" @@ -4206,10 +4948,14 @@ msgid "" "approaches, for example, to fine-tune a pre-trained model using federated" " learning." msgstr "" +"서버 측 파라미터 초기화는 강력한 메커니즘입니다. 예를 들어 이전에 저장한 " +"체크포인트에서 학습을 재개하는 데 사용할 수 있습니다. 또한 federated 학습을 " +"사용하여 사전 학습된 모델을 미세 조정하는 등 하이브리드 접근 방식을 구현하는 " +"데 필요한 기본 기능입니다." #: ../../source/how-to-implement-strategies.rst:216 msgid "The :code:`configure_fit` method" -msgstr "" +msgstr ":code:`configure_fit` 메서드" #: ../../source/how-to-implement-strategies.rst:218 msgid "" @@ -4218,6 +4964,10 @@ msgid "" "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`의 시그니처를 보면 이를 명확히 알 수 있습니다:" #: ../../source/how-to-implement-strategies.rst:231 msgid "" @@ -4225,6 +4975,9 @@ msgid "" "that will be sent to a particular client. Strategy implementations " "usually perform the following steps in :code:`configure_fit`:" msgstr "" +"반환 값은 튜플 목록으로, 각 튜플은 특정 클라이언트로 전송될 instruction을 " +"나타냅니다. 전략 구현은 일반적으로 :code:`configure_fit`에서 다음 단계를 " +"수행합니다:" #: ../../source/how-to-implement-strategies.rst:233 #: ../../source/how-to-implement-strategies.rst:280 @@ -4232,12 +4985,16 @@ 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` 개체로 표시됨)" #: ../../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`와 쌍을 이룹니다" #: ../../source/how-to-implement-strategies.rst:236 msgid "" @@ -4246,6 +5003,9 @@ msgid "" "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`가 포함된 경우에만 라운드에 참여합니다." #: ../../source/how-to-implement-strategies.rst:240 msgid "" @@ -4256,10 +5016,15 @@ msgid "" "different hyperparameters on different clients (via the :code:`config` " "dict)." msgstr "" +"이 반환 값의 구조는 사용자에게 많은 유연성을 제공합니다. instructions은 " +"클라이언트별로 정의되므로 각 클라이언트에 서로 다른 instructions을 전송할 수 " +"있습니다. 이를 통해 예를 들어 클라이언트마다 다른 모델을 학습시키거나 " +"클라이언트마다 다른 하이퍼파라미터를 사용하는 사용자 지정 전략을 사용할 수 " +"있습니다(:code:`config` dict를 통해)." #: ../../source/how-to-implement-strategies.rst:243 msgid "The :code:`aggregate_fit` method" -msgstr "" +msgstr ":code:`aggregate_fit` 메서드" #: ../../source/how-to-implement-strategies.rst:245 msgid "" @@ -4267,6 +5032,8 @@ msgid "" " by the clients that were selected and asked to train in " ":code:`configure_fit`." msgstr "" +"code:`aggregate_fit`은 :code:`configure_fit`에서 훈련하도록 선택되고 요청된 " +"클라이언트가 반환한 결과를 집계하는 역할을 담당합니다." #: ../../source/how-to-implement-strategies.rst:258 msgid "" @@ -4275,6 +5042,10 @@ msgid "" ":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` " +"목록도 받습니다." #: ../../source/how-to-implement-strategies.rst:260 msgid "" @@ -4283,10 +5054,14 @@ msgid "" " 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" -msgstr "" +msgstr ":code:`configure_evaluate` 메서드" #: ../../source/how-to-implement-strategies.rst:265 msgid "" @@ -4296,6 +5071,11 @@ msgid "" "instructions to send to these clients. The signature of " ":code:`configure_evaluate` makes this clear:" msgstr "" +":code:`configure_evaluate`는 다가오는 평가 라운드를 구성하는 역할을 합니다. " +"이 문맥에서 *구성*은 무엇을 의미하나요? 라운드를 구성한다는 것은 " +"클라이언트를 선택하고 이러한 클라이언트에 전송할 지침을 결정하는 것을 " +"의미합니다. :code:`configure_evaluate`의 시그니처를 보면 이를 명확히 알 수 " +"있습니다:" #: ../../source/how-to-implement-strategies.rst:278 msgid "" @@ -4303,12 +5083,17 @@ msgid "" "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" msgstr "" +"각 :code:`ClientProxy`를 현재 글로벌 모델 :code:`parameters` 및 " +":code:`config` dict를 보유한 동일한 :code:`EvaluateIns`와 쌍을 이룹니다" #: ../../source/how-to-implement-strategies.rst:283 msgid "" @@ -4317,6 +5102,10 @@ msgid "" "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`가 " +"포함된 경우에만 라운드에 참여합니다." #: ../../source/how-to-implement-strategies.rst:287 msgid "" @@ -4327,10 +5116,15 @@ msgid "" "different hyperparameters on different clients (via the :code:`config` " "dict)." msgstr "" +"이 반환 값의 구조는 사용자에게 많은 유연성을 제공합니다. instructions은 " +"클라이언트별로 정의되므로 각 클라이언트에 서로 다른 instructions을 전송할 수 " +"있습니다. 이를 통해 사용자 지정 전략을 통해 예를 들어 클라이언트마다 다른 " +"모델을 평가하거나 클라이언트마다 다른 하이퍼파라미터를 사용할 수 " +"있습니다(:code:`config` dict를 통해)." #: ../../source/how-to-implement-strategies.rst:291 msgid "The :code:`aggregate_evaluate` method" -msgstr "" +msgstr ":code:`aggregate_evaluate` 메서드" #: ../../source/how-to-implement-strategies.rst:293 msgid "" @@ -4338,6 +5132,8 @@ msgid "" "returned by the clients that were selected and asked to evaluate in " ":code:`configure_evaluate`." msgstr "" +"code:`aggregate_evaluate`는 :code:`configure_evaluate`에서 선택되어 평가를 " +"요청한 클라이언트가 반환한 결과를 집계하는 역할을 담당합니다." #: ../../source/how-to-implement-strategies.rst:306 msgid "" @@ -4346,6 +5142,10 @@ msgid "" ":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` 목록도 받습니다." #: ../../source/how-to-implement-strategies.rst:308 msgid "" @@ -4354,10 +5154,14 @@ msgid "" "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" -msgstr "" +msgstr ":code:`evaluate` 메서드" #: ../../source/how-to-implement-strategies.rst:313 msgid "" @@ -4366,6 +5170,10 @@ msgid "" ":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) 평가를 모두 수행할 수 있는 " +"전략을 사용할 수 있습니다." #: ../../source/how-to-implement-strategies.rst:323 msgid "" @@ -4374,63 +5182,69 @@ msgid "" ":code:`evaluate` method might not complete successfully (e.g., it might " "fail to load the server-side evaluation data)." msgstr "" +"반환 값은 전략에서 서버 측 평가를 구현할 필요가 없거나 사용자 정의 " +":code:`evaluate` 메서드가 성공적으로 완료되지 않을 수 있기 때문에(예: 서버 " +"측 평가 데이터를 로드하지 못할 수 있음) 다시 선택 사항으로 설정할 수 " +"있습니다." #: ../../source/how-to-install-flower.rst:2 msgid "Install Flower" -msgstr "" +msgstr "Flower 설치" #: ../../source/how-to-install-flower.rst:6 msgid "Python version" -msgstr "" +msgstr "Python 버전" #: ../../source/how-to-install-flower.rst:12 msgid "Install stable release" -msgstr "" +msgstr "안정적인 릴리즈 설치" #: ../../source/how-to-install-flower.rst:15 #: ../../source/how-to-upgrade-to-flower-next.rst:46 msgid "Using pip" -msgstr "" +msgstr "pip 사용" #: ../../source/how-to-install-flower.rst:17 msgid "" "Stable releases are available on `PyPI " "`_::" -msgstr "" +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 "" +msgstr "가상 클라이언트 엔진을 사용하는 시뮬레이션의 경우 ``flwr``을 ``simulation``" +"extra와 함께 설치해야 합니다:" #: ../../source/how-to-install-flower.rst:27 msgid "Using conda (or mamba)" -msgstr "" +msgstr "conda(또는 mamba) 사용" #: ../../source/how-to-install-flower.rst:29 msgid "Flower can also be installed from the ``conda-forge`` channel." -msgstr "" +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::" -msgstr "" +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 "" +msgstr "conda-forge`` 채널이 활성화되면 ``flwr``을 ``conda``로 설치할 수 있습니다::" #: ../../source/how-to-install-flower.rst:40 msgid "or with ``mamba``::" -msgstr "" +msgstr "또는 ``mamba``::" #: ../../source/how-to-install-flower.rst:46 msgid "Verify installation" -msgstr "" +msgstr "설치 확인" #: ../../source/how-to-install-flower.rst:48 msgid "" @@ -4438,22 +5252,25 @@ msgid "" "installed. If everything worked, it should print the version of Flower to" " the command line::" msgstr "" +"다음 명령을 사용하여 Flower가 성공적으로 설치되었는지 확인할 수 있습니다. " +"모든 것이 정상적으로 작동하면 명령줄에 Flower의 버전이 출력됩니다:" #: ../../source/how-to-install-flower.rst:55 msgid "Advanced installation options" -msgstr "" +msgstr "고급 설치 옵션" #: ../../source/how-to-install-flower.rst:58 msgid "Install via Docker" -msgstr "" +msgstr "Docker를 통해 설치" #: ../../source/how-to-install-flower.rst:60 msgid ":doc:`How to run Flower using Docker `" -msgstr "" +msgstr ":doc:`Docker를 사용하여 Flower를 실행하는 방법 `" #: ../../source/how-to-install-flower.rst:63 msgid "Install pre-release" -msgstr "" +msgstr "사전 릴리즈 설치" #: ../../source/how-to-install-flower.rst:65 msgid "" @@ -4461,32 +5278,39 @@ msgid "" "pre-release versions (alpha, beta, release candidate) before the stable " "release happens::" msgstr "" +"새(불안정할 수 있는) 버전의 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::" msgstr "" +"가상 클라이언트 엔진을 사용하는 시뮬레이션의 경우 ``flwr`` 사전 릴리즈를 " +"``simulation`` extra와 함께 설치해야 합니다:" #: ../../source/how-to-install-flower.rst:74 msgid "Install nightly release" -msgstr "" +msgstr "야간 릴리즈 설치" #: ../../source/how-to-install-flower.rst:76 msgid "" "The latest (potentially unstable) changes in Flower are available as " "nightly releases::" -msgstr "" +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::" msgstr "" +"가상 클라이언트 엔진을 사용하는 시뮬레이션의 경우, ``flwr-nightly``를 " +"``simulation`` extr와 함께 설치해야 합니다::" #: ../../source/how-to-monitor-simulation.rst:2 msgid "Monitor simulation" -msgstr "" +msgstr "모니터 시뮬레이션" #: ../../source/how-to-monitor-simulation.rst:4 msgid "" @@ -4496,16 +5320,22 @@ msgid "" "constrain the total usage. Insights from resource consumption can help " "you make smarter decisions and speed up the execution time." msgstr "" +"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." msgstr "" +"구체적인 지침은 macOS를 사용 중이고 'Homebrew `_ 패키지 " +"관리자가 설치되어 있다고 가정합니다." #: ../../source/how-to-monitor-simulation.rst:10 msgid "Downloads" -msgstr "" +msgstr "다운로드" #: ../../source/how-to-monitor-simulation.rst:16 msgid "" @@ -4514,26 +5344,31 @@ msgid "" "collected data. They are both well integrated with `Ray " "`_ which Flower uses under the hood." msgstr "" +"`Prometheus `_는 데이터 수집에 사용되며, `Grafana " +"`_는 수집된 데이터를 시각화할 수 있게 해줍니다. 이 두 " +"도구는 모두 Flower가 내부적으로 사용하는 `Ray `_와 잘 " +"통합되어 있습니다." #: ../../source/how-to-monitor-simulation.rst:18 msgid "" "Overwrite the configuration files (depending on your device, it might be " "installed on a different path)." -msgstr "" +msgstr "구성 파일을 덮어씁니다(장치에 따라 다른 경로에 설치되어 있을 수 있음)." #: ../../source/how-to-monitor-simulation.rst:20 msgid "If you are on an M1 Mac, it should be:" -msgstr "" +msgstr "M1 Mac을 사용 중이라면:" #: ../../source/how-to-monitor-simulation.rst:27 msgid "On the previous generation Intel Mac devices, it should be:" -msgstr "" +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 "" +msgstr "각 구성 파일을 열고 변경합니다. 장치에 따라 다음 두 명령 중 하나를 " +"사용합니다:" #: ../../source/how-to-monitor-simulation.rst:44 msgid "" @@ -4541,6 +5376,8 @@ msgid "" "config you see below. You may adjust the time intervals to your " "requirements:" msgstr "" +"를 입력한 다음 파일의 모든 텍스트를 삭제하고 아래에 표시된 새 Prometheus " +"설정을 붙여넣습니다. 요구 사항에 따라 시간 간격을 조정할 수 있습니다:" #: ../../source/how-to-monitor-simulation.rst:59 msgid "" @@ -4548,54 +5385,59 @@ msgid "" "the Grafana configuration files. Open those using one of the following " "commands as before:" msgstr "" +"이제 Prometheus 구성을 편집한 후 Grafana 구성 파일에 대해서도 동일한 작업을 " +"수행합니다. 이전과 마찬가지로 다음 명령 중 하나를 사용하여 파일을 엽니다:" #: ../../source/how-to-monitor-simulation.rst:69 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 "" +msgstr "축하합니다. 매트릭 트레킹에 필요한 모든 소프트웨어를 다운로드하셨습니다. " +"이제 시작해 보겠습니다." #: ../../source/how-to-monitor-simulation.rst:88 msgid "Tracking metrics" -msgstr "" +msgstr "매트릭 트래킹" #: ../../source/how-to-monitor-simulation.rst:90 msgid "" "Before running your Flower simulation, you have to start the monitoring " "tools you have just installed and configured." -msgstr "" +msgstr "Flower 시뮬레이션을 실행하기 전에 방금 설치 및 구성한 모니터링 도구를 " +"시작해야 합니다." #: ../../source/how-to-monitor-simulation.rst:97 msgid "" "Please include the following argument in your Python code when starting a" " simulation." -msgstr "" +msgstr "시뮬레이션을 시작할 때 Python 코드에 다음 argument를 포함하세요." #: ../../source/how-to-monitor-simulation.rst:108 msgid "Now, you are ready to start your workload." -msgstr "" +msgstr "이제 워크로드를 시작할 준비가 되었습니다." #: ../../source/how-to-monitor-simulation.rst:110 msgid "" "Shortly after the simulation starts, you should see the following logs in" " your terminal:" -msgstr "" +msgstr "시뮬레이션이 시작되고 얼마 지나지 않아 터미널에 다음 로그가 표시됩니다:" #: ../../source/how-to-monitor-simulation.rst:117 msgid "You can look at everything at ``_ ." -msgstr "" +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 "" +msgstr "Ray 대시보드입니다. 메트릭(왼쪽 패널의 가장 아래 옵션)으로 이동할 수 " +"있습니다." #: ../../source/how-to-monitor-simulation.rst:121 msgid "" @@ -4605,6 +5447,11 @@ msgid "" "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를 시작할 " +"수 있습니다." #: ../../source/how-to-monitor-simulation.rst:123 msgid "" @@ -4612,16 +5459,19 @@ msgid "" "important as they will otherwise block, for example port :code:`3000` on " "your machine as long as they are running." msgstr "" +"시각화를 완료한 후에는 Prometheus와 Grafana를 중지합니다. 그렇지 않으면 실행 " +"중인 동안 컴퓨터에서 포트 :code:`3000` 등을 차단하므로 이 작업이 중요합니다." #: ../../source/how-to-monitor-simulation.rst:132 msgid "Resource allocation" -msgstr "" +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 "" +msgstr "Ray 라이브러리가 어떻게 작동하는지 이해해야 시뮬레이션 클라이언트에 시스템 " +"리소스를 효율적으로 할당할 수 있습니다." #: ../../source/how-to-monitor-simulation.rst:136 msgid "" @@ -4632,20 +5482,27 @@ msgid "" "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:" -msgstr "" +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 "" +msgstr "그러나 기본값을 덮어쓸 수 있습니다. 시뮬레이션을 시작할 때 다음을 수행합니다(" +"모두 덮어쓸 필요는 없음):" #: ../../source/how-to-monitor-simulation.rst:175 msgid "Let’s also specify the resource for a single client." -msgstr "" +msgstr "단일 클라이언트에 대한 리소스도 지정해 보겠습니다." #: ../../source/how-to-monitor-simulation.rst:205 msgid "" @@ -4653,6 +5510,8 @@ msgid "" "all the required resources (such that they run in parallel) when the " "resources allow." msgstr "" +"이제 중요한 부분이 나옵니다. Ray는 리소스가 허용하는 경우에만 필요한 모든 " +"리소스가 있을 때(병렬로 실행되는 등) 새 클라이언트를 시작합니다." #: ../../source/how-to-monitor-simulation.rst:207 msgid "" @@ -4663,14 +5522,20 @@ msgid "" ":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개를 설정한 경우에도 마찬가지입니다)." #: ../../source/how-to-monitor-simulation.rst:212 ../../source/ref-faq.rst:2 msgid "FAQ" -msgstr "" +msgstr "자주 묻는 질문" #: ../../source/how-to-monitor-simulation.rst:214 msgid "Q: I don't see any metrics logged." -msgstr "" +msgstr "질문: 기록된 메트릭이 보이지 않습니다." #: ../../source/how-to-monitor-simulation.rst:216 msgid "" @@ -4678,6 +5543,9 @@ msgid "" "right corner (\"Last 30 minutes\" by default). Please change the " "timeframe to reflect the period when the simulation was running." msgstr "" +"A: 기간이 제대로 설정되지 않았을 수 있습니다. 설정은 오른쪽 상단에 있습니다(" +"기본값은 '지난 30분'). 시뮬레이션이 실행된 기간을 반영하도록 기간을 변경해 " +"주세요." #: ../../source/how-to-monitor-simulation.rst:218 msgid "" @@ -4685,42 +5553,49 @@ msgid "" "server is running and refresh this page” after going to the Metrics tab " "in Ray Dashboard." msgstr "" +"질문: \"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 "" +msgstr "A: Grafana가 실행되고 있지 않을 수 있습니다. 실행 중인 서비스를 확인하세요" #: ../../source/how-to-monitor-simulation.rst:226 msgid "" "Q: I see \"This site can't be reached\" when going to " "``_." msgstr "" +"Q: ``_로 이동할 때 \"이 사이트에 연결할 수 없습니다." +"\"라는 메시지가 표시됩니다." #: ../../source/how-to-monitor-simulation.rst:228 msgid "" "A: Either the simulation has already finished, or you still need to start" " Prometheus." -msgstr "" +msgstr "A: 시뮬레이션이 이미 완료되었거나 아직 Prometheus를 시작해야 합니다." #: ../../source/how-to-monitor-simulation.rst:232 msgid "Resources" -msgstr "" +msgstr "리소스" #: ../../source/how-to-monitor-simulation.rst:234 msgid "" "Ray Dashboard: ``_" msgstr "" +"Ray 대시보드: ``_" #: ../../source/how-to-monitor-simulation.rst:236 msgid "Ray Metrics: ``_" -msgstr "" +msgstr "Ray 메트릭: ``_" #: ../../source/how-to-run-flower-using-docker.rst:2 msgid "Run Flower using Docker" -msgstr "" +msgstr "Docker를 사용하여 Flower 실행" #: ../../source/how-to-run-flower-using-docker.rst:4 msgid "" @@ -4729,10 +5604,13 @@ msgid "" "`__. Supported architectures include " "``amd64`` and ``arm64v8``." msgstr "" +"Flower를 시작하는 가장 간단한 방법은 `Docker Hub `__에서 찾을 수 있는 미리 만들어진 Docker 이미지를 사용하는 것입니다. " +"지원되는 아키텍처는 ``amd64`` 및 ``arm64v8``입니다." #: ../../source/how-to-run-flower-using-docker.rst:8 msgid "Before you start, make sure that the Docker daemon is running:" -msgstr "" +msgstr "시작하기 전에 Docker daemon이 실행 중인지 확인하세요:" #: ../../source/how-to-run-flower-using-docker.rst:15 msgid "" @@ -4741,6 +5619,9 @@ msgid "" "You can find installation instruction `here `_." msgstr "" +"전이 표시되지 않고 대신 명령을 찾을 수 없다는 오류가 표시되는 경우 먼저 " +"Docker를 설치해야 합니다. `여기 `_에서 " +"설치 지침을 찾을 수 있습니다." #: ../../source/how-to-run-flower-using-docker.rst:21 msgid "" @@ -4749,6 +5630,9 @@ msgid "" "`_ on the " "official Docker website." msgstr "" +"Linux에서 Docker 명령을 실행하려면 ``sudo`` 권한이 필요합니다. sudo``를 " +"사용하지 않으려면 공식 Docker 웹사이트의 `Post-installation steps " +"`_를 따르세요." #: ../../source/how-to-run-flower-using-docker.rst:27 msgid "" @@ -4757,18 +5641,22 @@ msgid "" "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" -msgstr "" +msgstr "Flower SuperLink" #: ../../source/how-to-run-flower-using-docker.rst:35 msgid "Quickstart" -msgstr "" +msgstr "빠른 시작" #: ../../source/how-to-run-flower-using-docker.rst:37 msgid "If you're looking to try out Flower, you can use the following command:" -msgstr "" +msgstr "Flower를 사용해보고 싶다면 다음 명령을 사용하면 됩니다:" #: ../../source/how-to-run-flower-using-docker.rst:43 msgid "" @@ -4776,6 +5664,9 @@ msgid "" "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에 지시합니다." #: ../../source/how-to-run-flower-using-docker.rst:49 msgid "" @@ -4784,6 +5675,9 @@ msgid "" "starts. We will show below how to save the state in a file on your host " "system." msgstr "" +"기본적으로 Flower SuperLink는 상태를 in-memory에 유지합니다. Docker 플래그 " +"`--rm``을 사용하는 경우 컨테이너 시작 사이에 상태가 유지되지 않습니다. " +"아래에서 호스트 시스템의 파일에 상태를 저장하는 방법을 보여드리겠습니다." #: ../../source/how-to-run-flower-using-docker.rst:53 msgid "" @@ -4794,6 +5688,11 @@ msgid "" "after the tag is passed to the Flower SuperLink. Here, we are passing the" " flag ``--insecure``." msgstr "" +"``-p :`` 플래그는 호스트의 포트 ``9091``/``9092``를 " +"컨테이너의 ``9091``/``9092``에 매핑하여 ``http://localhost:9091``의 드라이버 " +"API와 ``http://localhost:9092``의 Fleet API에 액세스할 수 있도록 Docker에 " +"지시합니다. 마지막으로, 태그 뒤에 오는 모든 플래그는 Flower SuperLink에 " +"전달됩니다. 여기서는 ``--insecure``플래그를 전달합니다." #: ../../source/how-to-run-flower-using-docker.rst:60 #: ../../source/how-to-run-flower-using-docker.rst:259 @@ -4805,16 +5704,20 @@ msgid "" "flower-using-docker.html#enabling-ssl-for-secure-connections>`__ when " "deploying to a production environment." msgstr "" +"``--insecure`` 플래그는 안전하지 않은 통신(HTTPS가 아닌 HTTP 사용)을 " +"활성화하며 테스트 목적으로만 사용해야 합니다. 프로덕션 환경에 배포할 때는 `" +"SSL `__을 활성화할 것을 강력히 권장합니다." #: ../../source/how-to-run-flower-using-docker.rst:65 msgid "" "You can use ``--help`` to view all available flags that the SuperLink " "supports:" -msgstr "" +msgstr "'`--help``을 사용하면 SuperLink가 지원하는 모든 플래그를 볼 수 있습니다:" #: ../../source/how-to-run-flower-using-docker.rst:72 msgid "Mounting a volume to store the state on the host system" -msgstr "" +msgstr "호스트 시스템에 상태를 저장할 볼륨 마운트하기" #: ../../source/how-to-run-flower-using-docker.rst:74 msgid "" @@ -4828,6 +5731,14 @@ msgid "" "you can change the user ID back to the current user ID by running ``sudo " "chown -R $USER:$(id -gn) state``." msgstr "" +"호스트 시스템에서 SuperLink의 상태를 유지하려면 호스트 시스템에서 파일을 " +"저장할 디렉터리와 데이터베이스 파일의 이름을 지정하기만 하면 됩니다. " +"기본적으로 SuperLink 컨테이너는 사용자 ID가 ``49999``인 ``app``이라는 루트가 " +"아닌 사용자로 실행됩니다. 마운트된 디렉터리에 적절한 권한이 있는지 " +"확인하려면 새 디렉터리를 생성하고 디렉터리의 사용자 ID를 ``49999``로 " +"변경하는 것이 좋습니다. 나중에 디렉터리를 삭제하려면 ``sudo chown -R $USER:$(" +"id -gn) state``를 실행하여 사용자 ID를 현재 사용자 ID로 다시 변경할 수 " +"있습니다." #: ../../source/how-to-run-flower-using-docker.rst:82 msgid "" @@ -4837,6 +5748,10 @@ msgid "" "Furthermore, we use the flag ``--database`` to specify the name of the " "database file." msgstr "" +"아래 예에서는 새 디렉터리를 생성하고, 사용자 ID를 변경하고, 플래그 " +"``--volume``을 통해 Docker에게 로컬 ``state`` 디렉터리를 컨테이너의 ``/app/" +"state`` 디렉터리에 마운트하도록 지시합니다. 또한 ``--database`` 플래그를 " +"사용하여 데이터베이스 파일의 이름을 지정합니다." #: ../../source/how-to-run-flower-using-docker.rst:95 msgid "" @@ -4845,18 +5760,24 @@ msgid "" "SuperLink tries to restore the state from the file. To start the " "SuperLink with an empty database, simply remove the ``state.db`` file." msgstr "" +"SuperLink가 시작되자마자 호스트 시스템의 ``state`` 디렉터리에 ``state.db`` " +"파일이 생성됩니다. 파일이 이미 존재하는 경우 SuperLink는 파일에서 상태를 " +"복원하려고 시도합니다. 빈 데이터베이스로 SuperLink를 시작하려면 ``state.db`` " +"파일을 제거하면 됩니다." #: ../../source/how-to-run-flower-using-docker.rst:100 #: ../../source/how-to-run-flower-using-docker.rst:281 #: ../../source/how-to-run-flower-using-docker.rst:397 msgid "Enabling SSL for secure connections" -msgstr "" +msgstr "보안 연결을 위한 SSL 사용 설정" #: ../../source/how-to-run-flower-using-docker.rst:102 msgid "" "To enable SSL, you will need a PEM-encoded root certificate, a PEM-" "encoded private key and a PEM-encoded certificate chain." msgstr "" +"SSL을 사용하려면 PEM으로 인코딩된 루트 인증서, PEM으로 인코딩된 개인 키 및 " +"PEM으로 인코딩된 인증서 체인이 필요합니다." #: ../../source/how-to-run-flower-using-docker.rst:106 msgid "" @@ -4865,6 +5786,9 @@ msgid "" "enable-ssl-connections.html#certificates>`__ page contains a section that" " will guide you through the process." msgstr "" +"테스트 목적으로 자체 서명된 인증서를 생성할 수 있습니다. 'SSL 연결 사용 " +"`__ 페이지에 프로세스를 안내하는 섹션이 있습니다." #: ../../source/how-to-run-flower-using-docker.rst:110 msgid "" @@ -4877,6 +5801,14 @@ msgid "" "the names of the certificates and key file to the SuperLink with the " "``--ssl-ca-certfile``, ``--ssl-certfile`` and ``--ssl-keyfile`` flag." msgstr "" +"필요한 모든 파일이 로컬``certificates`` 디렉터리에 있다고 가정하면, " +"``--volume``플래그를 사용하여 로컬 디렉터리를 컨테이너의 ``/app/certificates/" +"`` 디렉터리에 마운트할 수 있습니다. 이렇게 하면 SuperLink 가 컨테이너 내의 " +"파일에 액세스할 수 있습니다. ``ro``는 ``read-only``을 의미합니다. Docker " +"볼륨은 기본적으로 ``read-write``로 설정되어 있는데, 이 옵션을 사용하면 " +"볼륨을 ``read-only``으로 만들 수 있습니다. 마지막으로 인증서 및 키 파일의 " +"이름을 ``--ssl-ca-certfile``, ``--ssl-certfile`` 및 ``--ssl-keyfile`` " +"플래그와 함께 SuperLink에 전달합니다." #: ../../source/how-to-run-flower-using-docker.rst:128 msgid "" @@ -4886,16 +5818,22 @@ msgid "" " the ``certificates/`` directory, you can run ``sudo chown -R 49999:49999" " certificates/*``." msgstr "" +"기본적으로 Flower 컨테이너는 루트가 아닌 사용자 ``app``로 실행되므로 " +"마운트된 파일과 디렉터리에 사용자 ID ``49999``에 대한 적절한 권한이 있어야 " +"합니다. 예를 들어, ``certificates/`` 디렉터리에 있는 모든 파일의 사용자 ID를 " +"변경하려면 ``sudo chown -R 49999:49999 certificates/*``를 실행하면 됩니다." #: ../../source/how-to-run-flower-using-docker.rst:134 msgid "Flower SuperNode" -msgstr "" +msgstr "Flower SuperNode" #: ../../source/how-to-run-flower-using-docker.rst:136 msgid "" "The SuperNode Docker image comes with a pre-installed version of Flower " "and serves as a base for building your own SuperNode image." msgstr "" +"SuperNode Docker 이미지는 Flower의 사전 설치된 버전과 함께 제공되며, 자체 " +"SuperNode 이미지를 구축하기 위한 기반 역할을 합니다." #: ../../source/how-to-run-flower-using-docker.rst:141 msgid "" @@ -4906,12 +5844,19 @@ msgid "" "same day. To ensure the versions are in sync, using the concrete tag, " "e.g., ``1.9.0.dev20240501`` instead of ``nightly`` is recommended." msgstr "" +"SuperNode Docker 이미지는 현재 1.9.0 야간 릴리스에서만 작동합니다. 안정 " +"버전은 Flower 1.9.0(안정)이 출시되면 사용할 수 있습니다(예상 출시일: 5월). " +"SuperNode 야간 이미지는 같은 날 릴리스된 해당 SuperLink 및 서버앱 야간 " +"이미지와 페어링되어야 합니다. 버전이 동기화되도록 하려면 ``nightly`` 대신 ``1" +".9.0.dev20240501``과 같은 구체적인 태그를 사용하는 것이 좋습니다." #: ../../source/how-to-run-flower-using-docker.rst:147 msgid "" "We will use the ``quickstart-pytorch`` example, which you can find in the" " Flower repository, to illustrate how you can dockerize your ClientApp." msgstr "" +"Flower 레포지토리에서 찾을 수 있는 ``quickstart-pytorch`` 예제를 사용하여 " +"ClientApp을 도커라이즈하는 방법을 설명하겠습니다." #: ../../source/how-to-run-flower-using-docker.rst:155 msgid "" @@ -4919,19 +5864,22 @@ msgid "" "development environment. You can skip the first part if you want to run " "your ClientApp instead of the ``quickstart-pytorch`` example." msgstr "" +"시작하기 전에 로컬 개발 환경에서 몇 가지 전제 조건을 충족해야 합니다. " +"'quickstart-pytorch' 예제 대신 ClientApp을 실행하려는 경우 첫 번째 부분을 " +"건너뛸 수 있습니다." #: ../../source/how-to-run-flower-using-docker.rst:159 msgid "Clone the Flower repository." -msgstr "" +msgstr "플라워 레포지토리를 클론합니다." #: ../../source/how-to-run-flower-using-docker.rst:173 msgid "Creating a SuperNode Dockerfile" -msgstr "" +msgstr "SuperNode Dockerfile 만들기" #: ../../source/how-to-run-flower-using-docker.rst:175 #: ../../source/how-to-run-flower-using-docker.rst:311 msgid "Let's assume the following project layout:" -msgstr "" +msgstr "다음과 같은 프로젝트 레이아웃을 가정해 보겠습니다:" #: ../../source/how-to-run-flower-using-docker.rst:184 msgid "" @@ -4939,6 +5887,9 @@ msgid "" "where the ``ClientApp`` code is located. In the file, we list all the " "dependencies that the ClientApp requires." msgstr "" +"먼저 ``ClientApp`` 코드가 있는 디렉토리에 ``requirements.txt`` 파일을 " +"만들어야 합니다. 이 파일에는 클라이언트 앱에 필요한 모든 dependencies을 " +"나열합니다." #: ../../source/how-to-run-flower-using-docker.rst:196 msgid "" @@ -4947,6 +5898,9 @@ msgid "" "package dependencies in your ``requirements.txt``, such as ``torch``, " "``tensorflow``, etc." msgstr "" +"`flwr `__ 는 이미 ``flwr/supernode`` 기본 " +"이미지에 설치되어 있으므로, ``torch``, ``tensorflow`` 등과 같은 다른 패키지 " +"dependencies만 ``requirements.txt``에 포함시키면 됩니다." #: ../../source/how-to-run-flower-using-docker.rst:200 msgid "" @@ -4954,12 +5908,16 @@ msgid "" "example, create a new file called ``Dockerfile.supernode`` in ``examples" "/quickstart-pytorch``." msgstr "" +"다음으로, Dockerfile을 생성합니다.``quickstart-pytorch`` 예제를 사용하는 " +"경우 ``examples/quickstart-pytorch``에 ``Dockerfile.supernode``라는 새 " +"파일을 생성합니다." #: ../../source/how-to-run-flower-using-docker.rst:203 msgid "" "The ``Dockerfile.supernode`` contains the instructions that assemble the " "SuperNode image." -msgstr "" +msgstr "``Dockerfile.supernode``에는 SuperNode 이미지를 조립하는 지침이 포함되어 " +"있습니다." #: ../../source/how-to-run-flower-using-docker.rst:217 msgid "" @@ -4973,16 +5931,26 @@ msgid "" "``client:app``. The argument is the object reference of the ClientApp " "(``:``) that will be run inside the ClientApp." msgstr "" +"처음 두 줄에서는 ``nightly`` 태그가 붙은 SuperNode 이미지를 기본 이미지로 " +"사용하고 작업 디렉터리를 ``/app``로 설정하도록 Docker에 지시합니다. 이제 " +"``/app`` 디렉토리에서 다음 명령이 실행됩니다. 다음으로, ``requirements.txt`` " +"파일을 이미지에 복사하여 ClientApp dependencies 요소를 설치하고 ``pip " +"install``을 실행합니다. 마지막 두 줄에서 ``client.py`` 모듈을 이미지에 " +"복사하고 ``client:app`` 인수를 사용하여 진입점을 ``flower-client-app``로 " +"설정합니다. 인수는 클라이언트앱 내부에서 실행될 클라이언트앱의 객체 참조 " +"(``:``) 입니다." #: ../../source/how-to-run-flower-using-docker.rst:226 msgid "Building the SuperNode Docker image" -msgstr "" +msgstr "SuperNode Docker 이미지 빌드" #: ../../source/how-to-run-flower-using-docker.rst:228 msgid "" "Next, we build the SuperNode Docker image by running the following " "command in the directory where Dockerfile and ClientApp code are located." msgstr "" +"다음으로, Dockerfile 및 ClientApp 코드가 있는 디렉터리에서 다음 명령을 " +"실행하여 SuperNode Docker 이미지를 빌드합니다." #: ../../source/how-to-run-flower-using-docker.rst:235 msgid "" @@ -4990,50 +5958,54 @@ msgid "" "Remember that the here chosen values only serve as an example. You can " "change them to your needs." msgstr "" +"이미지에 ``flwr_supernode``라는 이름을 붙이고 ``0.0.1`` 태그를 붙였습니다. " +"여기서 선택한 값은 예시일 뿐이라는 점을 기억하세요. 필요에 따라 변경할 수 " +"있습니다." #: ../../source/how-to-run-flower-using-docker.rst:240 msgid "Running the SuperNode Docker image" -msgstr "" +msgstr "SuperNode Docker 이미지 실행" #: ../../source/how-to-run-flower-using-docker.rst:242 msgid "Now that we have built the SuperNode image, we can finally run it." -msgstr "" +msgstr "이제 SuperNode 이미지를 빌드했으니 이제 실행할 수 있습니다." #: ../../source/how-to-run-flower-using-docker.rst:250 #: ../../source/how-to-run-flower-using-docker.rst:367 msgid "Let's break down each part of this command:" -msgstr "" +msgstr "이 명령의 각 부분을 자세히 살펴보겠습니다:" #: ../../source/how-to-run-flower-using-docker.rst:252 #: ../../source/how-to-run-flower-using-docker.rst:369 msgid "``docker run``: This is the command to run a new Docker container." -msgstr "" +msgstr "``docker run``: 새 Docker 컨테이너를 실행하는 명령입니다." #: ../../source/how-to-run-flower-using-docker.rst:253 #: ../../source/how-to-run-flower-using-docker.rst:370 msgid "" "``--rm``: This option specifies that the container should be " "automatically removed when it stops." -msgstr "" +msgstr "``--rm``: 이 옵션은 컨테이너가 중지될 때 자동으로 제거되도록 지정합니다." #: ../../source/how-to-run-flower-using-docker.rst:254 msgid "``flwr_supernode:0.0.1``: The name the tag of the Docker image to use." -msgstr "" +msgstr "``flwr_supernode:0.0.1``: 사용할 Docker 이미지의 태그 이름입니다." #: ../../source/how-to-run-flower-using-docker.rst:255 #: ../../source/how-to-run-flower-using-docker.rst:372 msgid "``--insecure``: This option enables insecure communication." -msgstr "" +msgstr "``--insecure``: 이 옵션은 보안되지 않은 통신을 활성화합니다." #: ../../source/how-to-run-flower-using-docker.rst msgid "" "``--superlink 192.168.1.100:9092``: This option specifies the address of " "the SuperLinks Fleet" -msgstr "" +msgstr "``--superlink 192.168.1.100:9092``: 이 옵션은 SuperLinks Fleet의 주소를 " +"지정합니다" #: ../../source/how-to-run-flower-using-docker.rst msgid "API to connect to. Remember to update it with your SuperLink IP." -msgstr "" +msgstr "API에 연결할 수 있습니다. SuperLink IP로 업데이트하는 것을 잊지 마세요." #: ../../source/how-to-run-flower-using-docker.rst:269 msgid "" @@ -5042,18 +6014,25 @@ msgid "" "defined-bridge-networks>`__, use the ``--network`` argument and pass the " "name of the Docker network to run your SuperNodes." msgstr "" +"로컬에서 Flower를 실행하는 것을 테스트하려면 `bridge network `__를 생성하고 ``--network`` argument를 사용하고 SuperNodes를 " +"실행할 Docker 네트워크의 이름을 전달하면 됩니다." #: ../../source/how-to-run-flower-using-docker.rst:273 msgid "" "Any argument that comes after the tag is passed to the Flower SuperNode " "binary. To see all available flags that the SuperNode supports, run:" msgstr "" +"태그 뒤에 오는 모든 argument는 Flower SuperNode 바이너리에 전달됩니다. " +"SuperNode가 지원하는 사용 가능한 모든 플래그를 보려면 실행하세요:" #: ../../source/how-to-run-flower-using-docker.rst:283 msgid "" "To enable SSL, we will need to mount a PEM-encoded root certificate into " "your SuperNode container." -msgstr "" +msgstr "SSL을 사용하려면 PEM 인코딩된 루트 인증서를 SuperNode 컨테이너에 마운트해야 " +"합니다." #: ../../source/how-to-run-flower-using-docker.rst:285 msgid "" @@ -5063,16 +6042,21 @@ msgid "" "within the container. Use the ``--root-certificates`` flag when starting " "the container." msgstr "" +"인증서가 이미 로컬에 존재한다고 가정하면, ``--volume`` 플래그를 사용하여 " +"로컬 인증서를 컨테이너의 ``/app/`` 디렉터리에 마운트할 수 있습니다. 이렇게 " +"하면 SuperNode가 컨테이너 내의 인증서에 액세스할 수 있습니다. 컨테이너를 " +"시작할 때 ``--root-certificates`` 플래그를 사용하세요." #: ../../source/how-to-run-flower-using-docker.rst:297 msgid "Flower ServerApp" -msgstr "" +msgstr "Flower 서버앱" #: ../../source/how-to-run-flower-using-docker.rst:299 msgid "" "The procedure for building and running a ServerApp image is almost " "identical to the SuperNode image." -msgstr "" +msgstr "ServerApp 이미지를 빌드하고 실행하는 절차는 SuperNode 이미지와 거의 " +"동일합니다." #: ../../source/how-to-run-flower-using-docker.rst:301 msgid "" @@ -5080,6 +6064,9 @@ msgid "" "pre-installed version of Flower and serves as a base for building your " "own ServerApp image." msgstr "" +"SuperNode 이미지와 마찬가지로 ServerApp Docker 이미지는 Flower의 사전 설치된 " +"버전과 함께 제공되며, 자체 ServerApp 이미지를 구축하기 위한 기본 역할을 " +"합니다." #: ../../source/how-to-run-flower-using-docker.rst:304 msgid "" @@ -5087,10 +6074,13 @@ msgid "" "Flower SuperNode section. If you have not already done so, please follow " "the `SuperNode Prerequisites`_ before proceeding." msgstr "" +"여기서는 Flower SuperNode 섹션에서와 동일한`quickstart-pytorch`` 예제를 " +"사용하겠습니다. 아직 수행하지 않았다면 계속 진행하기 전에 `SuperNode " +"Prerequisites`_ 을 따르세요." #: ../../source/how-to-run-flower-using-docker.rst:309 msgid "Creating a ServerApp Dockerfile" -msgstr "" +msgstr "ServerApp Dockerfile 만들기" #: ../../source/how-to-run-flower-using-docker.rst:320 msgid "" @@ -5099,12 +6089,16 @@ msgid "" "example, create a new file called ``Dockerfile.serverapp`` in ``examples" "/quickstart-pytorch``." msgstr "" +"먼저, ``ServerApp`` 코드가 있는 디렉토리에 Docker파일을 생성해야 합니다. " +"``quickstart-pytorch`` 예제를 사용하는 경우 ``examples/quickstart-pytorch``" +"에 ``Dockerfile.serverapp``이라는 새 파일을 생성합니다." #: ../../source/how-to-run-flower-using-docker.rst:324 msgid "" "The ``Dockerfile.serverapp`` contains the instructions that assemble the " "ServerApp image." -msgstr "" +msgstr "``Dockerfile.serverapp``에는 ServerApp 이미지를 합치는 지침이 포함되어 " +"있습니다." #: ../../source/how-to-run-flower-using-docker.rst:335 msgid "" @@ -5117,16 +6111,24 @@ msgid "" "ServerApp (``:``) that will be run inside the " "ServerApp container." msgstr "" +"처음 두 줄에서는 ``1.8.0`` 태그가 붙은 ServerApp 이미지를 기본 이미지로 " +"사용하고 작업 디렉터리를 ``/app``로 설정하도록 Docker에 지시합니다. 이제 " +"``/app`` 디렉토리에서 다음 명령이 실행됩니다. 마지막 두 줄에서는 ``server." +"py`` 모듈을 이미지에 복사하고 ``server:app`` argument를 사용하여 진입점을 " +"``flower-server-app``로 설정합니다. 인수는 ServerApp 컨테이너 내에서 실행될 " +"ServerApp의 객체 참조(``:``)입니다." #: ../../source/how-to-run-flower-using-docker.rst:343 msgid "Building the ServerApp Docker image" -msgstr "" +msgstr "ServerApp Docker 이미지 빌드" #: ../../source/how-to-run-flower-using-docker.rst:345 msgid "" "Next, we build the ServerApp Docker image by running the following " "command in the directory where Dockerfile and ServerApp code are located." msgstr "" +"다음으로, Docker파일과 ServerApp 코드가 있는 디렉터리에서 다음 명령을 " +"실행하여 ServerApp Docker 이미지를 빌드합니다." #: ../../source/how-to-run-flower-using-docker.rst:352 msgid "" @@ -21815,4 +22817,3 @@ msgstr "" #~ msgid "|83a8daee45da4a98b8d6f24ae098fc50|" #~ msgstr "" - diff --git a/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py b/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py index 93aca583af9c..8a21393db590 100644 --- a/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +++ b/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py @@ -15,7 +15,7 @@ """Ray backend for the Fleet API using the Simulation Engine.""" import pathlib -from logging import DEBUG, ERROR, WARNING +from logging import DEBUG, ERROR from typing import Callable, Dict, List, Tuple, Union import ray @@ -24,16 +24,15 @@ from flwr.common.context import Context from flwr.common.logger import log from flwr.common.message import Message -from flwr.simulation.ray_transport.ray_actor import ( - BasicActorPool, - ClientAppActor, - init_ray, -) +from flwr.common.typing import ConfigsRecordValues +from flwr.simulation.ray_transport.ray_actor import BasicActorPool, ClientAppActor from flwr.simulation.ray_transport.utils import enable_tf_gpu_growth from .backend import Backend, BackendConfig ClientResourcesDict = Dict[str, Union[int, float]] +ActorArgsDict = Dict[str, Union[int, float, Callable[[], None]]] +RunTimeEnvDict = Dict[str, Union[str, List[str]]] class RayBackend(Backend): @@ -51,40 +50,29 @@ def __init__( if not pathlib.Path(work_dir).exists(): raise ValueError(f"Specified work_dir {work_dir} does not exist.") - # Init ray and append working dir if needed - runtime_env = ( - self._configure_runtime_env(work_dir=work_dir) if work_dir else None - ) - - if backend_config.get("mute_logging", False): - init_ray( - logging_level=WARNING, log_to_driver=False, runtime_env=runtime_env - ) - elif backend_config.get("silent", False): - init_ray(logging_level=WARNING, log_to_driver=True, runtime_env=runtime_env) - else: - init_ray(runtime_env=runtime_env) + # Initialise ray + self.init_args_key = "init_args" + self.init_ray(backend_config, work_dir) # Validate client resources self.client_resources_key = "client_resources" + client_resources = self._validate_client_resources(config=backend_config) # Create actor pool - use_tf = backend_config.get("tensorflow", False) - actor_kwargs = {"on_actor_init_fn": enable_tf_gpu_growth} if use_tf else {} + actor_kwargs = self._validate_actor_arguments(config=backend_config) - client_resources = self._validate_client_resources(config=backend_config) self.pool = BasicActorPool( actor_type=ClientAppActor, client_resources=client_resources, actor_kwargs=actor_kwargs, ) - def _configure_runtime_env(self, work_dir: str) -> Dict[str, Union[str, List[str]]]: + def _configure_runtime_env(self, work_dir: str) -> RunTimeEnvDict: """Return list of files/subdirectories to exclude relative to work_dir. Without this, Ray will push everything to the Ray Cluster. """ - runtime_env: Dict[str, Union[str, List[str]]] = {"working_dir": work_dir} + runtime_env: RunTimeEnvDict = {"working_dir": work_dir} excludes = [] path = pathlib.Path(work_dir) @@ -125,6 +113,37 @@ def _validate_client_resources(self, config: BackendConfig) -> ClientResourcesDi return client_resources + def _validate_actor_arguments(self, config: BackendConfig) -> ActorArgsDict: + actor_args_config = config.get("actor", False) + actor_args: ActorArgsDict = {} + if actor_args_config: + use_tf = actor_args.get("tensorflow", False) + if use_tf: + actor_args["on_actor_init_fn"] = enable_tf_gpu_growth + return actor_args + + def init_ray(self, backend_config: BackendConfig, work_dir: str) -> None: + """Intialises Ray if not already initialised.""" + if not ray.is_initialized(): + # Init ray and append working dir if needed + runtime_env = ( + self._configure_runtime_env(work_dir=work_dir) if work_dir else None + ) + + ray_init_args: Dict[ + str, + Union[ConfigsRecordValues, RunTimeEnvDict], + ] = {} + + if backend_config.get(self.init_args_key): + for k, v in backend_config[self.init_args_key].items(): + ray_init_args[k] = v + + if runtime_env is not None: + ray_init_args["runtime_env"] = runtime_env + + ray.init(**ray_init_args) + @property def num_workers(self) -> int: """Return number of actors in pool.""" @@ -152,7 +171,7 @@ async def process_message( partition_id = message.metadata.partition_id try: - # Submite a task to the pool + # Submit a task to the pool future = await self.pool.submit( lambda a, a_fn, mssg, cid, state: a.run.remote(a_fn, mssg, cid, state), (app, message, str(partition_id), context), diff --git a/src/py/flwr/server/superlink/fleet/vce/backend/raybackend_test.py b/src/py/flwr/server/superlink/fleet/vce/backend/raybackend_test.py index dcac0b81d666..57c952cc9310 100644 --- a/src/py/flwr/server/superlink/fleet/vce/backend/raybackend_test.py +++ b/src/py/flwr/server/superlink/fleet/vce/backend/raybackend_test.py @@ -38,6 +38,7 @@ ) from flwr.common.object_ref import load_app from flwr.common.recordset_compat import getpropertiesins_to_recordset +from flwr.server.superlink.fleet.vce.backend.backend import BackendConfig from flwr.server.superlink.fleet.vce.backend.raybackend import RayBackend @@ -215,3 +216,35 @@ def test_backend_creation_submit_and_termination_existing_client_app_unsetworkdi workdir="/?&%$^#%@$!", ) self.addAsyncCleanup(self.on_cleanup) + + def test_backend_creation_with_init_arguments(self) -> None: + """Testing whether init args are properly parsed to Ray.""" + backend_config_4: BackendConfig = { + "init_args": {"num_cpus": 4}, + "client_resources": {"num_cpus": 1, "num_gpus": 0}, + } + + backend_config_2: BackendConfig = { + "init_args": {"num_cpus": 2}, + "client_resources": {"num_cpus": 1, "num_gpus": 0}, + } + + RayBackend( + backend_config=backend_config_4, + work_dir="", + ) + nodes = ray.nodes() + + assert nodes[0]["Resources"]["CPU"] == backend_config_4["init_args"]["num_cpus"] + + ray.shutdown() + + RayBackend( + backend_config=backend_config_2, + work_dir="", + ) + nodes = ray.nodes() + + assert nodes[0]["Resources"]["CPU"] == backend_config_2["init_args"]["num_cpus"] + + self.addAsyncCleanup(self.on_cleanup) diff --git a/src/py/flwr/simulation/ray_transport/ray_actor.py b/src/py/flwr/simulation/ray_transport/ray_actor.py index 9caf0fc3e6c0..7afffb865334 100644 --- a/src/py/flwr/simulation/ray_transport/ray_actor.py +++ b/src/py/flwr/simulation/ray_transport/ray_actor.py @@ -399,12 +399,6 @@ def get_client_result( return self._fetch_future_result(cid) -def init_ray(*args: Any, **kwargs: Any) -> None: - """Intialises Ray if not already initialised.""" - if not ray.is_initialized(): - ray.init(*args, **kwargs) - - class BasicActorPool: """A basic actor pool.""" diff --git a/src/py/flwr/simulation/run_simulation.py b/src/py/flwr/simulation/run_simulation.py index a3de1401d252..7c7a412a245b 100644 --- a/src/py/flwr/simulation/run_simulation.py +++ b/src/py/flwr/simulation/run_simulation.py @@ -22,16 +22,17 @@ import traceback from logging import DEBUG, ERROR, INFO, WARNING from time import sleep -from typing import Dict, Optional +from typing import Optional from flwr.client import ClientApp from flwr.common import EventType, event, log from flwr.common.logger import set_logger_propagation, update_console_handler -from flwr.common.typing import ConfigsRecordValues, Run +from flwr.common.typing import Run from flwr.server.driver import Driver, InMemoryDriver from flwr.server.run_serverapp import run from flwr.server.server_app import ServerApp from flwr.server.superlink.fleet import vce +from flwr.server.superlink.fleet.vce.backend.backend import BackendConfig from flwr.server.superlink.state import StateFactory from flwr.simulation.ray_transport.utils import ( enable_tf_gpu_growth as enable_gpu_growth, @@ -66,7 +67,7 @@ def run_simulation( client_app: ClientApp, num_supernodes: int, backend_name: str = "ray", - backend_config: Optional[Dict[str, ConfigsRecordValues]] = None, + backend_config: Optional[BackendConfig] = None, enable_tf_gpu_growth: bool = False, verbose_logging: bool = False, ) -> None: @@ -90,9 +91,12 @@ def run_simulation( backend_name : str (default: ray) A simulation backend that runs `ClientApp`s. - backend_config : Optional[Dict[str, ConfigsRecordValues]] - 'A dictionary, e.g {"": , "": } to configure a - backend. Values supported in are those included by + backend_config : Optional[BackendConfig] + 'A dictionary to configure a backend. Separate dictionaries to configure + different elements of backend. Supported top-level keys are `init_args` + for values parsed to initialisation of backend, `client_resources` + to define the resources for clients, and `actor` to define the actor + parameters. Values supported in are those included by `flwr.common.typing.ConfigsRecordValues`. enable_tf_gpu_growth : bool (default: False) @@ -104,7 +108,7 @@ def run_simulation( works in the TensorFlow documentation: https://www.tensorflow.org/api/stable. verbose_logging : bool (default: False) - When diabled, only INFO, WARNING and ERROR log messages will be shown. If + When disabled, only INFO, WARNING and ERROR log messages will be shown. If enabled, DEBUG-level logs will be displayed. """ _run_simulation( @@ -133,7 +137,7 @@ def run_serverapp_th( def server_th_with_start_checks( # type: ignore tf_gpu_growth: bool, stop_event: asyncio.Event, **kwargs ) -> None: - """Run SeverApp, after check if GPU memory grouwth has to be set. + """Run SeverApp, after check if GPU memory growth has to be set. Upon exception, trigger stop event for Simulation Engine. """ @@ -194,7 +198,7 @@ def _main_loop( ) -> None: """Launch SuperLink with Simulation Engine, then ServerApp on a separate thread. - Everything runs on the main thread or a separate one, depening on whether the main + Everything runs on the main thread or a separate one, depending on whether the main thread already contains a running Asyncio event loop. This is the case if running the Simulation Engine on a Jupyter/Colab notebook. """ @@ -259,7 +263,7 @@ def _run_simulation( client_app: Optional[ClientApp] = None, server_app: Optional[ServerApp] = None, backend_name: str = "ray", - backend_config: Optional[Dict[str, ConfigsRecordValues]] = None, + backend_config: Optional[BackendConfig] = None, client_app_attr: Optional[str] = None, server_app_attr: Optional[str] = None, app_dir: str = "", @@ -286,9 +290,12 @@ def _run_simulation( backend_name : str (default: ray) A simulation backend that runs `ClientApp`s. - backend_config : Optional[Dict[str, ConfigsRecordValues]] - 'A dictionary, e.g {"":, "":} to configure a - backend. Values supported in are those included by + backend_config : Optional[BackendConfig] + 'A dictionary to configure a backend. Separate dictionaries to configure + different elements of backend. Supported top-level keys are `init_args` + for values parsed to initialisation of backend, `client_resources` + to define the resources for clients, and `actor` to define the actor + parameters. Values supported in are those included by `flwr.common.typing.ConfigsRecordValues`. client_app_attr : str @@ -310,30 +317,34 @@ def _run_simulation( A boolean to indicate whether to enable GPU growth on the main thread. This is desirable if you make use of a TensorFlow model on your `ServerApp` while having your `ClientApp` running on the same GPU. Without enabling this, you - might encounter an out-of-memory error becasue TensorFlow by default allocates + might encounter an out-of-memory error because TensorFlow by default allocates all GPU memory. Read mor about how `tf.config.experimental.set_memory_growth()` works in the TensorFlow documentation: https://www.tensorflow.org/api/stable. verbose_logging : bool (default: False) - When diabled, only INFO, WARNING and ERROR log messages will be shown. If + When disabled, only INFO, WARNING and ERROR log messages will be shown. If enabled, DEBUG-level logs will be displayed. """ if backend_config is None: backend_config = {} + if "init_args" not in backend_config: + backend_config["init_args"] = {} + # Set logging level logger = logging.getLogger("flwr") if verbose_logging: update_console_handler(level=DEBUG, timestamps=True, colored=True) else: - backend_config["silent"] = True + backend_config["init_args"]["logging_level"] = WARNING + backend_config["init_args"]["log_to_driver"] = True if enable_tf_gpu_growth: # Check that Backend config has also enabled using GPU growth - use_tf = backend_config.get("tensorflow", False) + use_tf = backend_config.get("actor", {}).get("tensorflow", False) if not use_tf: log(WARNING, "Enabling GPU growth for your backend.") - backend_config["tensorflow"] = True + backend_config["actor"]["tensorflow"] = True # Convert config to original JSON-stream format backend_config_stream = json.dumps(backend_config) @@ -352,7 +363,7 @@ def _run_simulation( server_app_attr, ) # Detect if there is an Asyncio event loop already running. - # If yes, run everything on a separate thread. In environmnets + # If yes, run everything on a separate thread. In environments # like Jupyter/Colab notebooks, there is an event loop present. run_in_thread = False try: @@ -364,7 +375,7 @@ def _run_simulation( run_in_thread = True except RuntimeError: - log(DEBUG, "No asyncio event loop runnig") + log(DEBUG, "No asyncio event loop running") finally: if run_in_thread: @@ -409,7 +420,8 @@ def _parse_args_run_simulation() -> argparse.ArgumentParser: parser.add_argument( "--backend-config", type=str, - default='{"client_resources": {"num_cpus":2, "num_gpus":0.0}, "tensorflow": 0}', + default='{"client_resources": {"num_cpus":2, "num_gpus":0.0},' + '"actor": {"tensorflow": 0}}', help='A JSON formatted stream, e.g \'{"":, "":}\' to ' "configure a backend. Values supported in are those included by " "`flwr.common.typing.ConfigsRecordValues`. ",