Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

advanced/cpp_export 오타 수정입니다 #703

Merged
merged 1 commit into from
Aug 12, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 14 additions & 14 deletions advanced_source/cpp_export.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ PyTorch의 이름에서 알 수 있듯이 PyTorch는 Python 프로그래밍 언
Python은 동적성과 신속한 이터레이션이 필요한 상황에 적합하고 선호되는 언어입니다. 하지만 마찬가지로
이러한 Python의 특징들이 Python을 사용하기 적합하지 않게 만드는 상황도 많이 발생합니다. Python을 사용하기
적합하지 않은 대표적인 예로 상용 환경이 있습니다. 상용 환경에서는 짧은 지연시간이 중요하고
배포하는 데에도 많은 제약이 따릅니다. 이로 인해 상용 환경에서는 많은 사람들이 C++를 개발언어로 채택하게
배포하는 데에도 많은 제약이 따릅니다. 이로 인해 상용 환경에서는 많은 사람들이 C++를 개발언어로 채택하게
됩니다. 단지 Java, Rust, 또는 Go와 같은 다른 언어들을 바인딩하기 위한 목적일 뿐일지라도 말이죠.
앞으로 이 튜토리얼에서 저희는 어떻게 PyTorch에서 Python으로 작성된 모델들을 Python 의존성이 전혀
앞으로 이 튜토리얼에서 어떻게 PyTorch에서 Python으로 작성된 모델들을 Python 의존성이 전혀
없는 C++환경에서도 읽고 실행할 수 있는 방식으로 직렬화할 수 있는지 알아보겠습니다.

단계 1. PyTorch 모델을 TorchScript 모델로 변환하기
Expand All @@ -18,19 +18,19 @@ Python은 동적성과 신속한 이터레이션이 필요한 상황에 적합
C++로 변환하는 것을 가능하게 해줍니다. TorchScript는 TorchScript 컴파일러가 이해하고, 컴파일하고,
직렬화할 수 있는 PyTorch 모델의 한 표현방식입니다. 만약 기본적인 "즉시 실행"[역자 주: eager execution]
API를 사용해 작성된 PyTorch 모델이 있다면, 처음으로 해야할 일은 이 모델을 TorchScript 모델로 변환하는
것입니다. 아래에 설명되어있듯이, 대부분의 경우에 이 과정은 매우 간단합니다. 이미 TorchScript 모듈을 가지고 있다면,
것입니다. 아래에 설명되어 있듯이, 대부분의 경우에 이 과정은 매우 간단합니다. 이미 TorchScript 모듈을 가지고 있다면,
이 섹션을 건너뛰어도 좋습니다.

PyTorch 모델을 TorchScript로 변환하는 방법에는 두가지가 있습니다. 첫번째는 트레이싱(tracing)이라는 방법으로
어떤 입력값을 사용하여 모델의 구조를 파악하고 이 입력값의 모델 안에서의 흐름을 통해 모델을 기록하는 방식입니다.
이 방법은 조건문을 많이 사용하지 않는 모델의 경우에 적합합니다. PyTorch 모델을 TorchScript로 변환하는
두번째 방법은 모델에 명시적인 어노테이션(annotation)을 추가하여 TorchScript 컴파일러로
하여금 직접 모델 코드를 분석하고 컴파일하게하는 방식입니다. 이 방식을 사용할 때는 TorchScript 언어
하여금 직접 모델 코드를 분석하고 컴파일하게 하는 방식입니다. 이 방식을 사용할 때는 TorchScript 언어
자체에 제약이 있을 수 있습니다.

.. tip::

위 두 방식에 관련된 정보와 둘 중 어떤 방법을 사용해야할지 등에 대한 가이드는 공식 기술문서인 `Torch Script
위 두 방식에 관련된 정보와 둘 중 어떤 방법을 사용해야 할지 등에 대한 가이드는 공식 기술문서인 `Torch Script
reference <https://pytorch.org/docs/master/jit.html>`_ 에서 확인하실 수 있습니다.

트레이싱(tracing)을 통해 TorchScript로 변환하기
Expand Down Expand Up @@ -121,13 +121,13 @@ TorchScript로 바로 작성하는 것이 바람직한 경우가 있습니다.

이 함수는 ``traced_resnet_model.pt`` 파일을 작업 디렉토리에 생성할 것입니다. 만약 어노테이션 예시의
``sm`` 을 직렬화하고 싶다면, ``sm.save("my_module_model.pt")`` 를
호출하면 됩니다. 이로써 우리는 이제 Python의 세계에서 벗어나 C++ 환경에서 작업할 준비를 마쳤습니다.
호출하면 됩니다. 이로써 이제 Python의 세계에서 벗어나 C++ 환경에서 작업할 준비를 마쳤습니다.

단계 3. C++에서 Script 모듈 로딩하기
------------------------------------------

직렬화된 PyTorch 모델을 C++에서 로드하기 위해서는, 어플리케이션이 반드시 *LibTorch* 라고 불리는
PyTorch C++ API를 사용해야합니다. LibTorch는 여러 공유 라이브러리들, 헤더 파일들, 그리고 CMake
PyTorch C++ API를 사용해야 합니다. LibTorch는 여러 공유 라이브러리들, 헤더 파일들, 그리고 CMake
빌드 설정파일들을 포함하고 있습니다. CMake는 LibTorch를 쓰기위한 필수 요구사항은 아니지만, 권장되는
방식이고 향후에도 계속 지원될 예정입니다. 이 튜토리얼에서는 CMake와 LibTorch를 사용하여 직렬화된
PyTorch 모델을 읽고 실행하는 아주 간단한 C++ 어플리케이션을 만들어보도록 하겠습니다.
Expand Down Expand Up @@ -200,14 +200,14 @@ page <https://pytorch.org/>`_ 로부터 받으실 수 있습니다. 가장 최
lib/
share/

- ``lib/`` 폴더는 링크해야할 공유 라이브러리를 포함하고 있습니다.
- ``include/`` 폴더는 여러분의 프로그램이 include해야할 헤더파일들을 담고 있습니다.
- ``share/`` 폴더는 위에서 실행한 간단한 명령어인 ``find_package(Torch)`` 를 실행하게해주는 CMake 설정을 담고있습니다.
- ``lib/`` 폴더는 링크해야 할 공유 라이브러리를 포함하고 있습니다.
- ``include/`` 폴더는 여러분의 프로그램이 include 해야 할 헤더 파일들을 담고 있습니다.
- ``share/`` 폴더는 위에서 실행한 간단한 명령어인 ``find_package(Torch)`` 를 실행하게 해주는 CMake 설정을 담고있습니다.

.. tip::
윈도우에서는 디버그 빌드와 릴리즈 빌드가 ABI-compatible하지 않습니다. 만약 프로젝트를
debug 모드에서 빌드하고 싶다면, LibTorch의 debug 버전을 사용해야합니다. 그리고 `cmake --build .``
에 알맞은 설정을 명시해주어야 합니다.
에 알맞은 설정을 명시해 주어야 합니다.

마지막 단계는 어플리케이션을 빌드하는 것입니다. 이를 위해서 디렉토리 구조가 아래와 같이 같다고
가정하겠습니다.
Expand Down Expand Up @@ -268,7 +268,7 @@ page <https://pytorch.org/>`_ 로부터 받으실 수 있습니다. 가장 최
[100%] Built target example-app

이제 trace된 ``ResNet18`` 모델인 ``traced_resnet_model.pt`` 경로를 ``example-app`` 바이너리에
입력했다면, 우리는 "ok" 메시지를 확인할 수 있을 것입니다. 만약이 예제에 ``my_module_model.pt`` 를
입력했다면, "ok" 메시지를 확인할 수 있을 것입니다. 만약이 예제에 ``my_module_model.pt`` 를
인자로 넘겼다면, 입력값이 호환되지 않는 모양이라는 에러메시지가 출력됩니다. ``my_module_model.pt`` 는
4D가 아닌 1D 텐서를 받도록 되어있기 때문입니다.

Expand Down Expand Up @@ -297,7 +297,7 @@ C++ 어플리케이션의 ``main()`` 함수에 아래의 코드를 추가하겠
입력받고 또 리턴할 수 있는 타입이 소거된 자료형)의 벡터를 만들고 그 벡터에 하나의 입력값을 추가합니다.
입력값 텐서를 만들기 위해서 우리는 ``torch::ones()`` 을 사용합니다. 이 함수는 ``torch.ones`` 의 C++ API 버전입니다.
이제 ``script::Module`` 의 ``forward`` 메소드에 입력값 벡터를 넘겨주어 실행하면, 우리는 새로운
``IValue`` 를 리턴받게되고, 이 값을 ``toTensor()`` 를 통해 텐서로 변환할 수 있습니다.
``IValue`` 를 리턴받게 되고, 이 값을 ``toTensor()`` 를 통해 텐서로 변환할 수 있습니다.

.. tip::

Expand Down Expand Up @@ -341,7 +341,7 @@ C++ 어플리케이션의 ``main()`` 함수에 아래의 코드를 추가하겠
더 나아가 디스크 상의 직렬화된 파일로, 그리고 마지막으로 C++에서 실행가능한 ``script::Module`` 까지 만들
수 있게 되었습니다.

물론 이 튜토리얼에서 다루지못한 개념들도 많습니다. 예를 들어 여러분의 ``ScriptModule`` 이 C++나 CUDA로
물론 이 튜토리얼에서 다루지 못한 개념들도 많습니다. 예를 들어 여러분의 ``ScriptModule`` 이 C++나 CUDA로
정의된 커스텀 연산자를 사용할 수 있게하는 방법 또는 이러한 커스텀 연산자를 C++ 상용 환경의 ``ScriptModule`` 에서
사용할 수 있게하는 방법에 대해서는 본 튜토리얼에서 다루지 않았습니다. 좋은 소식은 이러한 것들이 가능하다는 것이고 지원되고
있다는 점입니다! 저희가 곧 이것에 관한 튜토리얼을 업로드할 때까지 `이 폴더 <https://github.com/pytorch/pytorch/tree/master/test/custom_operator>`_
Expand Down