진행률 표시줄(tqdm)이 코드를 죽입니까?

5409 단어 programmingpythontqdm

소개



Python에 익숙한 모든 사람은 진행률 표시줄을 구현하는 빠르고 효과적인 방법이 tqdm 패키지를 사용하는 것임을 알고 있습니다. 간단한 pip 설치로 진행됩니다. 나는 오랫동안 tqdm를 사용해 왔으며 재미있는 사이드 프로젝트나 프로덕션 코드를 위해 사용할 수 있습니다.

작업



최근에 저는 NumPy 라이브러리만 사용하여 완전히 연결된 신경망을 구현하고 그 성능을 인기 있는 딥 러닝 프레임워크인 TensorFlow 및 PyTorch와 비교했습니다. 이 프로젝트에 관심이 있으시면 여기link를 확인하십시오.

훈련 중인 모델의 손실을 모니터링하는 것이 중요하며 제 생각에 가장 좋은 방법은 완료된 훈련의 양과 해당 시점의 손실을 추적할 수 있는 진행률 표시줄을 구현하는 것입니다.

TensorFlow는 이 기능을 즉시 사용할 수 있으며 매우 좋습니다. 반면에 PyTorch에서는 필요한 경우 교육 루프와 진행률 표시줄을 구현해야 합니다. 또한 NumPy 구현을 위한 진행률 표시줄이 필요했습니다. 그래서 tqdm를 사용하여 구현했습니다.

뭐!!!



반복할 때마다 업데이트되도록 진행률 표시줄을 구현했습니다. 이 구현을 통해 동일한 수의 에포크와 동일한 매개변수를 가진 동일한 데이터 세트에 대해 내 사용자 정의 구현 및 PyTorch 구현은 약 60분 동안 10개의 에포크를 실행한 반면 TensorFlow 구현은 동일한 작업을 단 25분 만에 완료했습니다. 뭐!!!

Tensorflow가 더 빠르게 실행하기 위해 일부 최적화를 활용하고 있을 수 있기 때문이라고 생각했습니다. 그래서 호기심에 깊이 파기 시작했고 마침내 진행률 표시줄이 범인이라는 것을 알게 되었습니다. 그런 다음 500회 반복 후 업데이트되도록 진행률 표시줄을 수정했습니다. 짜잔! PyTorch와 사용자 지정 구현이 모두 10분 미만으로 실행되었습니다!!!

이것은 또한 TensorFlow에서 진행률 표시줄의 업데이트 주기가 성능에 영향을 미치면 어떻게 될까요?라는 질문을 제기했습니다. 글쎄요.

예시



일을 명확하게하기 위해 예를 살펴 보겠습니다

from time import time
from tqdm import tqdm

LOOP = 50000

def task(update_cycle):
    pbar = tqdm(total=LOOP)
    for i, _ in enumerate(range(LOOP)):
        for _ in range(LOOP):
            pass

        if i % update_cycle == 0:
            pbar.update(update_cycle)

    pbar.close()

tic = time()
print(f'Update cycle: {1}')
task(1)
toc = time()
print(f'Time elapsed: {toc-tic:0.2f} seconds\n')

tic = time()
print(f'Update cycle: {500}')
task(500)
toc = time()
print(f'Time elapsed: {toc-tic:0.2f} seconds')


코드의 출력


업데이트 주기가 클 때 알 수 있듯이 작업이 더 빨리 완료됩니다. 멍청한 예라는 것을 알고 있지만 문제의 요지를 제공합니다.

결론


tqdm는 진행률 표시줄을 구현하는 환상적인 패키지입니다. 단 한 줄의 코드로 사용 가능한 진행률 표시줄을 얻을 수 있으며 광범위한 사용자 지정을 제공합니다. 그러나 다음에 진행률 표시줄을 구현할 때는 성능에 영향을 미치지 않는지 확인하십시오.

좋은 웹페이지 즐겨찾기