PyTorch Lightning 및 Hydra 최신 소식

PyTorch lightning 0.9 및 Hydra 1.0.0rc4의 새로운 기능을 사용하여 교육 스크립트를 50 % 축소 한 방법

계속 노력하십시오! — 소스

소개

지난주, PyTorch Lightning 0.9.0Hydra의 네 번째 1.0.0 릴리스 후보 가 새로운 기능과 대부분 최종 API로 가득한 상태로 출시되었습니다. 이 새로운 버전이 어떻게 통합 될 수 있는지 보기 위해 제 사이드 프로젝트 인 Leela Zero PyTorch 를 다시 방문하는 것이 좋은시기라고 생각 했습니다. 이 게시물에서는 두 라이브러리의 몇 가지 새로운 기능과 Leela Zero PyTorch가 어떻게 도움이되었는지에 대해 이야기하겠습니다. 여기서는 Leela Zero PyTorch에 대한 세부 사항에 대해 너무 많이 이야기하지 않을 것이므로 더 많은 컨텍스트를 위해 내 사이드 ​​프로젝트에 대해 더 자세히 읽고 싶다면 여기에서 이전 블로그 게시물을 읽을 수 있습니다 .

파이 토치 라이트닝 0.9.0

이것은 PyTorch Lightning 팀이 1.0.0 릴리스를 위해 부지런히 작업하는 데있어 중요한 이정표입니다. 여러 새로운 기능과 최종 기능에 훨씬 더 가까운 API를 소개합니다. 시작하기 전에이 릴리스에 대해 자세히 알아 보려면 공식 블로그 게시물을 확인하십시오 . 일반적으로 PyTorch Lightning에 대해 자세히 알아 보려면 Github 페이지공식 문서를 확인하십시오 .

결과

*_epoch_end메소드의 결과를 집계 할 수 있도록 메소드를 반복적으로 구현 한 적이 *_step있습니까? *_step*_epoch_end방법 에서 계산 된 측정 항목을 올바르게 기록하는 방법에 대해 알고 계셨습니까? 당신은 혼자가 아니며 PyTorch Lightning 0.9.0은 Result이러한 문제를 해결하기 위해 호출 된 새로운 추상화를 도입했습니다 .

Result, TrainResult및 두 가지 유형이 있습니다 EvalResult. 이름에서 알 수 있듯이 TrainResult학습 EvalResult에 사용되며 검증 및 테스트에 사용됩니다. 인터페이스는 간단합니다. 인스턴스화하는 동안 작동 할 기본 측정 항목을 지정한 다음 (의 경우 TrainResult최소화 할 측정 항목 EvalResult, 체크 포인트 또는 조기 중지 할 측정 항목) 기록 할 추가 측정 항목을 지정합니다. 내 프로젝트에서 어떻게 사용되는지 살펴 보겠습니다.

에서는 training_step()최소화 할 전체 손실을 지정하고 전체 손실 (진행률 표시 줄에 표시되도록 지정됨), 평균 제곱 오류 손실, 교차 엔트로피 손실 및 마지막으로 정확도 (PyTorch Lightning의 새로운 기능을 사용하여 계산 됨)를 기록합니다. 곧 논의 될 메트릭 패키지). 나는 그것을 처리하기 때문에 epoch 수준에서 그들을 집계하기 위해 코드를 작성할 필요가 없습니다 TrainResult. 실제로 각 측정 항목을 집계하고로 기록해야하는 수준 (단계, 에포크 또는 둘 다)을 지정할 수 있으며 TrainResult자동으로 모든 것을 처리합니다.

마찬가지로에서 validation_step()체크 포인트에 사용할 전체 손실을 지정하고 전체 손실, 평균 제곱 오차 손실, 교차 엔트로피 손실 및 정확도를 기록합니다. 다시 말하지만, validation_epoch_end()집계 및 로깅이에서 처리되기 때문에을 작성할 필요가 없습니다 EvalResult. 또한에 대해 반복 할 필요가 없으며 로깅 할 메트릭의 키를 test_step()호출 validation_step()하고 이름을 변경하기 만하면 됩니다.

.NET 덕분에 내 코드가 어떻게 더 간단하고 읽기 쉽고 유지 관리가 쉬워 졌는지 즉시 확인할 수 있습니다 Result. 여기에서 자세한 내용을 읽을 수 있습니다 .

지표

0.8에서 작업을 계속하면서 PyTorch Lightning 팀은 0.9.0에서 훨씬 더 많은 메트릭 구현을 도입했습니다. PyTorch Lightning의 모든 메트릭 구현은 PyTorch 모듈이며 그에 상응하는 기능이 있으므로 사용이 매우 쉽고 유연합니다. 내 프로젝트에서는 정확도의 기능적 구현을 ​​통합하기로 결정했습니다. 이는 단지 가져 와서 적절한 *_step메서드로 호출하는 문제였습니다 .

BLEU 점수와 같은 고급 NLP 메트릭을 포함하여 현재 PyTorch Lightning에 포함 된 다른 많은 메트릭 구현이 있습니다. 여기에서 자세한 내용을 읽을 수 있습니다 .

LightningDataModule

PyTorch Lightning에서 겪을 수있는 또 다른 문제점은 다양한 데이터 세트를 처리하는 것입니다. 0.9.0까지 PyTorch Lightning은 PyTorch의 DatasetDataLoader 를 사용하는 것을 제외하고 데이터 처리 코드를 구성하는 방법에 대해 침묵했습니다 . 이로 인해 많은 자유가 주어졌지만 데이터 세트 구현을 깨끗하고 유지 관리하고 다른 사람들과 쉽게 공유 할 수 있도록 유지하기가 어려웠습니다. 0.9.0에서 PyTorch Lightning은에서 데이터 처리 코드를 구성하는 새로운 방법을 도입하여 데이터 처리 LightningDataModule에서 가장 일반적인 단계를 캡슐화합니다. 그것은 다섯 개 가지 방법과 간단한 인터페이스를 가지고 : prepare_data(), setup(), train_dataloader(), val_dataloader()test_dataloader(). 각각의 역할을 이해하기 위해 내 프로젝트에서 어떻게 구현되는지 살펴 보겠습니다.

  • prepare_data():이 방법은 분산 학습을 위해 하위 프로세스를 분기하기 전에 주 프로세스에서 수행해야하는 모든 작업을위한 것입니다. 다운로드, 전처리 또는 디스크에 저장과 같은 작업이이 방법의 좋은 후보입니다. 한 가지주의해야 할 점은 여기에 설정된 상태가 분산 학습의 하위 프로세스로 전달되지 않는다는 것이므로 여기에서 상태를 설정하지 않도록주의해야합니다. 내 프로젝트에서 Go sgf 파일을 전처리하기 위해 Leela Zero에 의존하기 때문에이 방법 구현을 건너 뛰기로 결정했지만이 방법에서 전처리 단계를 기술적으로 구현할 수 있습니다.
  • setup () :이 메서드는 분산 학습을 위해 각 하위 프로세스에 대해 수행해야하는 모든 작업을위한 것입니다. 실제 PyTorch를 구성 Datasets하고 여기에서 필요한 상태를 설정해야합니다. Leela Zero PyTorch에서는 Datasets디스크에서 데이터를 읽어 텐서로 변환하고 상태로 저장 하는를 초기화 합니다.
  • *_dataloader(): DataLoaders훈련 / 검증 / 테스트를 위해 초기화 하는 곳 입니다. 필자의 경우에는 .NET을 setup()초기화하기 LightningDataModule위해의 초기화 중에 전달 된 구성뿐만 아니라 에서 생성 된 데이터 세트를 사용하기 만하면됩니다 DataLoaders.

히드라 1.0.0rc4

1.0.0rc4는 Hydra를 공식 1.0.0 릴리스에 더 가깝게 만듭니다. 여기에는 라이브러리를보다 성숙하고 사용하기 쉽게 만드는 많은 버그 수정과 몇 가지 중요한 API 변경 사항이 포함되어 있습니다. 시작하기 전에 Hydra에 대해 더 자세히 알고 싶다면 공식 웹 사이트공식 문서를 확인 하세요!

@ hydra.main ()

이 데코레이터를 OmegaConf를 허용하는 모든 함수에 추가 할 수 DictConfig있으며 Hydra는 스크립트의 다양한 측면을 자동으로 처리합니다. 이것은 그 자체로 새로운 기능은 아니지만 출력 디렉토리 구조와 작업 디렉토리를 차지한다는 사실 때문에 원래 사용하지 않기로 결정한 기능입니다. 이 문제를 해결하기 위해 나중에 설명 할 Hydra의 실험적인 Compose API를 실제로 사용했습니다. 그러나 Hydra의 제작자 인 Omry 와 대화를 나눈 후 이것이 권장되는 접근 방식이 아니라는 것을 깨달았을뿐만 아니라 명령 줄 인터페이스의 자동 처리, 자동 도움말 메시지 및 탭 완성. 게다가 얼마 동안 사용한 후 Hydra의 출력 디렉토리와 작업 디렉토리 관리가 매우 유용하다는 것을 알게되었습니다. PyTorch Lightning 측에서 로깅 디렉토리 구조를 수동으로 설정할 필요가 없기 때문입니다. 이 데코레이터에 대한 자세한 내용은 Hydra의 기본 튜토리얼 에서 읽을 수 있습니다 .

패키지 지침

Hydra 0.11에는 구성에 대한 전역 네임 스페이스가 하나만 있었지만 1.0.0에서는 패키지 지시문을 사용하여 다른 네임 스페이스에서 구성을 구성 할 수 있습니다. 이를 통해 불필요한 중첩없이 yaml 구성 파일을 평평하고 깔끔하게 유지할 수 있습니다. Leela Zero PyTorch의 네트워크 크기 구성을 살펴 보겠습니다.

네트워크 크기 구성이 지정된대로 "네트워크"아래에 추가되었습니다. "board_size"및 "in_channels"는 데이터 구성 (구성!)에서 제공됩니다.

보시다시피 패키지 지시문을 사용하면 구성을보다 쉽게 ​​관리 할 수 ​​있습니다. 여기에서 패키지 지시문 및 고급 사용 사례에 대해 자세히 알아볼 수 있습니다 .

개체 인스턴스화

Hydra는 개체를 인스턴스화하거나 구성에 따라 함수를 호출 할 수있는 기능을 제공합니다. 이것은 스크립트가 다양한 구현간에 전환 할 수있는 간단한 인터페이스를 갖기를 원할 때 매우 유용합니다. 이것은 새로운 기능도 아니지만 인터페이스는 1.0.0rc4에서 크게 향상되었습니다. 제 경우에는 네트워크 크기, 훈련 로거 및 데이터 세트 사이를 전환하는 데 사용합니다. 네트워크 크기 구성을 예로 들어 보겠습니다.

NetworkLightningModule__init__(), network_conf및에 대해 두 개의 인수를 허용합니다 train_conf. 전자는 구성에서 전달되고 후자는 instantiate()( cfg.train)에 추가 인수로 전달됩니다 . 다른 네트워크 크기를 선택 +network={small,big,huge}하려면 명령 줄에서 전달하기 만하면됩니다 . 다른으로 새 구성을 만들고 _target_명령 줄에 구성 이름을 전달 하여 완전히 다른 아키텍처를 선택하는 것을 상상할 수도 있습니다 . 명령 줄을 통해 모든 작은 세부 사항을 전달할 필요가 없습니다! 이 패턴에 대한 자세한 내용은 여기에서 읽을 수 있습니다 .

Compose API

Hydra의 Compose API는 스크립트 작성에 권장되는 방법은 아니지만 단위 테스트 작성에 여전히 권장되고 유용합니다. 기본 학습 스크립트에 대한 단위 테스트를 작성하는 데 사용했습니다. 다시 말하지만, 이것은 새로운 기능은 아니지만 Hydra 1.0.0rc4는 Python의 컨텍스트 관리자 ( with문)를 사용하여 Compose API에 대한 더 깨끗한 인터페이스를 제공합니다 .

당신은 작성 API에 대한 자세한 내용을보실 수 있습니다 여기에 , 어떻게 그것을 단위 테스트를 사용하는 여기 .

사용하지 않는 기능 : 구조화 된 구성 및 가변 보간

Hydra 1.0.0rc4에는 제가 활용하지 않은 다른 많은 기능이 있습니다. 대부분 통합 할 시간이 충분하지 않았기 때문입니다. 이 섹션에서 가장 큰 구성 인 구조화 된 구성에 대해 살펴 보겠습니다.

구조화 된 구성은 Python의 데이터 클래스 를 활용 하여 런타임 및 정적 유형 검사를 제공 하는 1.0.0에 도입 된 주요 새 기능 으로, 애플리케이션이 복잡 해짐에 따라 매우 유용 할 수 있습니다. 나중에 시간이 생기면 통합 할 것이므로 다른 블로그 게시물을 기대해주세요!

결론

Leela Zero PyTorch에 대한 첫 번째 블로그 게시물을 작성한 이후 Hydra와 PyTorch Lightning은 PyTorch 스크립트를 크게 단순화하는 데 도움이되는 여러 가지 새로운 기능과 추상화를 도입했습니다. 위에서 볼 수 있듯이, 제 기본 트레이닝 스크립트는 이전 56 줄에 비해 28 줄로 구성되어 있습니다. 또한 훈련 파이프 라인, 신경망 아키텍처, 데이터 세트 및 로거의 각 부분은 모듈 식이며 쉽게 교체 할 수 있습니다. 이를 통해 더 빠른 반복, 더 쉬운 유지 관리 및 더 나은 재현성을 가능하게하여 프로젝트의 가장 재미 있고 중요한 부분에 집중할 수 있습니다. 이 블로그 게시물이이 두 개의 멋진 라이브러리를 "계속 유지"하는 데 도움이 되었기를 바랍니다. Leela Zero PyTorch의 코드는 여기에서 찾을 수 있습니다 .

Suggested posts

IBM Watson Studio의 AutoAI 노트북으로 마술사 코드 깨기

IBM Watson Studio의 AutoAI 노트북으로 마술사 코드 깨기

가장 유명한 행동 강령 중 하나입니다. "마술사는 절대 비밀을 밝히지 않습니다." 그러나 청중이 너무나 놀라워 서 '방금 일어난 일'이라는 느낌에 놀라서 비밀을 밝히지 않는 것이 거의 잔인한 순간이 있습니다.

Python 코드 한 줄로 여러 시계열 예측 모델 학습

Auto-TS 라이브러리를 사용하여 ARIMA, SARIMAX, FB Prophet, VAR 및 ML 모델 개발

Python 코드 한 줄로 여러 시계열 예측 모델 학습

Automated Machine Learning (AutoML)은 기계 학습 파이프 라인의 일부 구성 요소를 자동화하는 것을 말합니다. AutoML은 일부 모델 개발 프로세스를 자동화하여 데이터 과학자의 워크 플로를 가속화합니다.

Related posts

데이터 과학을위한 필수 수학 : 기초 및 기초 변경

데이터 과학을위한 필수 수학 : 기초 및 기초 변경

고유 분해 및 SVD에 유용한 기저의 선형 대수 개념 이해이 기사에서는 고유 분해 또는 특이 값 분해 (SVD)와 같은 행렬 분해 방법을 이해하는 흥미로운 방법 인 기저 개념에 대해 알아 봅니다. 정의 기본은 벡터 공간 (벡터 집합)을 설명하는 데 사용되는 좌표계입니다.

판다와 에라스무스 연구 교환 분석

판다와 에라스무스 연구 교환 분석

Erasmus 프로그램 2011-12에서 발생한 20 만 개의 연구 교환으로 데이터 세트를 분석 한 결과 1987 년 이후 Erasmus 프로그램은 매년 수십만 명의 유럽 학생들에게 한 학기 또는 1 년을 해외에서 보낼 기회를 다른 유럽에서 보낼 수있는 기회를 제공합니다. 경제적 인 지원뿐만 아니라 쉬운 교환 과정을 제공합니다. 유럽의 다양한 사람, 언어 및 문화에 대한 마음과 마음을 열어주는 정말 귀중한 경험입니다.

데이터 과학을위한 8 가지 기본 통계 개념

… 평범한 영어로 설명

데이터 과학을위한 8 가지 기본 통계 개념

통계는 "수량 데이터의 수집, 분석, 해석 및 표현을 다루는 수학의 한 분야"입니다. 프로그래밍과 기계 학습을 혼합하면 데이터 과학의 핵심 기술에 대해 꽤 잘 설명 할 수 있습니다.

데이터 과학의 9 가지 거리 측정

일반적인 거리 측정의 장점과 함정

데이터 과학의 9 가지 거리 측정

감독되거나 감독되지 않는 많은 알고리즘은 거리 측정을 사용합니다. 유클리드 거리 또는 코사인 유사성과 같은 이러한 측정은 종종 k-NN, UMAP, HDBSCAN 등과 같은 알고리즘에서 찾을 수 있습니다.