>백엔드 개발 >파이썬 튜토리얼 >복권 퀘스트를 통해 PyTorch의 힘을 알게 된 방법

복권 퀘스트를 통해 PyTorch의 힘을 알게 된 방법

Linda Hamilton
Linda Hamilton원래의
2025-01-01 04:19:16648검색

소개

언젠가는 복권에 당첨될 확률이 매우 희박하다는 말을 들어보셨을 것입니다. 확률과 관련된 모든 것과 마찬가지로 여러 번 시도하면 결과가 유리하게 기울어질 수 있습니다. 이제, 많은 복권에 참여한다면 복권에 얼마나 더 참여하느냐에 따라 당첨 확률이 조금 더 높아질 것입니다. 이것이 결국 당첨될 것이라는 보장은 아니지만 균일한 분배를 통해 이루어집니다. , 그리고 대수의 법칙(이 경우에는 많은 수의 복권을 의미함)을 따르면 상대적으로 가능성이 더 높은 가능성에 도달할 수 있습니다.

각각의 새로운 복권은 서로 독립적이며 동일한 복권 '티켓 번호'가 대수의 법칙에 따라 다양한 복권에 당첨될 수 있다는 점을 이해하는 것이 중요합니다. 운이 좋지 않아 몇 번이나 시도했는지에 관계없이 모든 복권에서 잘못된 번호를 선택할 수도 있습니다. 이제 두 가지 옵션이 있습니다:

  1. 매번 임의의 숫자를 시도할 수 있습니다.
  2. 매번 같은 번호를 시도해 볼 수 있습니다.

이론적으로(및 수학적으로) 두 시나리오 모두 발생할 가능성은 동일합니다. 그러나 시나리오 2는 약간의 이점을 제공합니다. 횟수가 무한대에 가까워지면 결국 모든 숫자가 선택됩니다. 문제는 시나리오 1의 경우 당시 선택한 숫자가 승리한 숫자와 일치할 것이라는 희망을 가지고 더 많은 시도를 해야 한다는 것입니다. 시나리오 2에서는 시행이 무한대로 진행되는 경향이 있으므로 어느 시점에서 귀하의 숫자가 "승리"할 것이라고 확신합니다. 이 블로그 게시물에서는 시나리오 2를 사용합니다.

그럼 내가 답을 말하기 전에 이 질문에 답할 수 있을까요?

"주변의 모든 복권에 정확히 100만 명을 위한 슬롯이 있고 모든 사람에게 동일한 티켓 [x]을 선택했다면 최종적으로 당첨되려면 몇 개의 복권을 플레이해야 합니까?" (초기 답변이 무엇인지 자유롭게 의견을 남겨주세요)

답은...
How a Lottery Quest Led Me to The Powers of PyTorch

1,440만 번.

이 블로그 게시물의 나머지 부분에서는 해당 값에 도달한 방법, 시뮬레이션이 수행된 방법 및 몇 가지 주의 사항에 대해 설명합니다. 여기서부터는 좀 더 기술적인 내용이 추가됩니다.
How a Lottery Quest Led Me to The Powers of PyTorch

논리

100만 명 복권의 티켓 번호 범위는 1~1,000,000(또는 0~999,999)입니다. 플레이어는 각 복권에 대해 해당 범위 내의 숫자만 선택할 수 있으며, 당첨 티켓은 해당 범위에서만 나올 수 있습니다. 본질적으로 우리는 1백만 개의 숫자 집합을 갖게 될 것이라고 말할 수 있습니다.

사용자가 해당 범위 내에서 임의의 숫자를 선택할 수 있다는 사실을 고려하면 세트의 모든 항목이 적어도 한 번 적중되는 조건을 충족해야 합니다. 모든 번호가 한 번 이상 호출된 경우 플레이어가 선택할 수 있는 모든 티켓 번호가 포함되기 때문입니다. 이는 또한 각 숫자가 몇 번 실행되는지 신경 쓰지 않는다는 것을 의미하므로 "세트"를 시뮬레이션에 사용하기에 이상적인 Python 데이터 구조로 만듭니다. 빈 세트로 시작하여 세트가 지정된 범위 내의 모든 숫자를 포함할 때까지 각 반복마다 무작위로 생성된 숫자로 채웁니다. Python 세트는 숫자를 반복하지 않으므로 고유성 보장에 대해 걱정할 필요가 없습니다.

def calculate_lottery_chances(lottery_players_count):
  number_set = set()
  count = 0

  while len(number_set) < lottery_players_count:
    gen_number = random.randint(1, lottery_players_count)
    number_set.add(gen_number)
    count += 1

  return count

1,000,000명의 복권의 경우 함수 호출은 계산_lottery_chances(1000000)와 같으며 당첨되기 전의 복권 시도 횟수를 반환합니다. 이런 방식으로 코드를 배열하면 확장성이 매우 높아집니다.

How a Lottery Quest Led Me to The Powers of PyTorch

문제

간단히 말하면 문제의 근본 원인은 '변이'입니다. 처음 함수를 실행했을 때 "1,310만"배의 값이 나왔습니다. 다시 돌려보니 1,390만 정도가 나왔습니다. 나는 이 일을 훨씬 더 많이 했고 매우 다양한 답변을 얻었습니다. 어떤 시점에서는 1,500만 달러를 얻었습니다. 이 작업을 수행하고 평균을 찾아야 한다는 것이 분명했습니다. 지금까지의 기존 패턴에 따라 평균을 내는 반복 횟수가 무한대에 가까워짐에 따라 한 번 신뢰할 수 있는 답을 얻는 데 더 가까워질 것이라고 생각했습니다. 이 작업을 빠르게 수행할 수 있는 기능이 필요했기 때문에 다음 함수를 작성하게 되었습니다.

def average_over_n_times(function, function_arg, n):
  """
  This returns the average of the returned value of a function
  when it is called n times, with its (one) arg
  """
  total = 0
  for x in range(0, n):
    total += function(function_arg)

  return round(total/n)

그러면 모든 것이 다음과 같이 패치됩니다.

num_of_trials = average_over_n_times(calculate_lottery_chances, lottery_players_count, n)

여기서 "n"은 결과를 평균화하는 횟수를 나타냅니다. 그러나 이는 다음 섹션에서 논의할 또 다른 문제를 야기합니다.

"n"은 무엇이어야 합니까?

n 값이 클수록 '평균 사례' 결과에 가까워집니다. 그러나 아직 절대적인 것이나 확실성이 없다는 점을 고려하면 이러한 일련의 작업을 너무 많이 수행하면 생산적이지 않습니다. 제가 이렇게 말하는 이유는 다음과 같습니다.

  • 시간은 무한하지 않으며 이러한 계산을 무한정 수행할 수는 없습니다. 즉, 실행될 때마다 항상 변화(아무리 적더라도)가 발생하므로 "절대" 개념을 무너뜨립니다.
  • 컴퓨팅 자원은 유한합니다.
  • 이 실험의 가정 중 하나는 컴퓨터가 생성하는 '무작위성'이 현실을 정확하게 모방할 수 있다는 것입니다.
  • 알고리즘 런타임과 마찬가지로 더 작은 규모도 더 큰 규모만큼 중요하지 않습니다. 13,000,000보다 큰 값을 처리할 때 약 100,000의 변형은 그다지 중요하지 않습니다.

이 점을 염두에 두고 "n"을 10, 20, 30, 50, 100, 1000, 5000번 값으로 테스트했습니다.

PyTorch는 어디에 사용되나요?

이 시점에서 블로그 게시물 제목에 'PyTorch'라는 단어가 왜 언급되지 않았는지 궁금하실 것입니다. 글쎄요, n을 다른 값으로 테스트한다고 언급했지만 모든 테스트에 사용한 코드는 아니었습니다.

이것은 계산량이 많은 실험이었고 내 CPU가 나에게 한마디 했습니다. 이전에 공유한 코드 조각은 외부 패키지 종속성이 전혀 없는 하나의 파일에 작성되었으며, 파일은 실행 시간을 추적하기 위해 앞에 time 명령이 추가된 bash 셸에서 실행되었습니다. CPU만 사용할 때의 실행 시간은 다음과 같습니다.

n Time (min and sec)
10 1m34.494s
20 3m2.591s
30 5m19.903s
50 10m58.844s
100 14m56.157s

1000시에 더 이상 프로그램을 작동시킬 수 없었습니다. 중간에 깨져서 실행 중지에 실패한 것인지 확신이 없었으나 4시간 57분 만에 취소했습니다. 이에 영향을 받았다고 생각되는 몇 가지 요인이 있는데, 이에 대해서는 "주의 사항" 섹션에서 논의하겠습니다. 어쨌든, 내 팬 소음이 시끄러웠고, 내 노트북의 적당한 성능의 CPU를 너무 많이 밀어붙였을지도 모른다는 것을 알았습니다. 나는 패배를 받아들이지 않았고, 최소한 4자리 반복을 실행하기 위해 무엇을 할 수 있을지 생각하던 중 PyTorch로 작업했던 친구가 나에게 했던 말이 기억났습니다.

"GPU는 일반적으로 CPU보다 컴퓨팅 집약적 측면에서 더 효율적입니다."

PyTorch는 GPU를 사용하므로 작업에 완벽한 도구입니다.

리팩토링

PyTorch는 우리 목적을 위한 계산에 사용되므로 기존 계산_lottery_chances() 코드를 리팩토링한다는 것은 CPU 기반 수치 연산을 변경하고 적합한 PyTorch 데이터 구조로 전환하는 것을 의미합니다. 간단히 말해서:

  • Python set() 데이터 유형은 더 이상 충분하지 않습니다.
  • Python randint() 함수는 PyTorch에 해당하는 함수로 교체됩니다.
  • set() 데이터 유형이 충분하지 않기 때문에 lottery_players_count의 크기와 일치하는 0의 텐서를 생성하는 스위치가 있으며 숫자가 이전에 당첨되었는지 여부를 나타내는 부울이 있습니다.

calculate_lottery_chances의 리팩터링은 다음과 같습니다.

def calculate_lottery_chances(lottery_players_count):
  number_set = set()
  count = 0

  while len(number_set) < lottery_players_count:
    gen_number = random.randint(1, lottery_players_count)
    number_set.add(gen_number)
    count += 1

  return count

제 컴퓨터는 PyTorch가 지원하는 Intel Graphics GPU를 사용하기 때문에 장치를 "xpu"로 설정했습니다.

산출

실행 중에 GPU가 사용되었는지 확인하기 위해 실행하기 전에 Windows 작업 관리자를 열고 "성능" 섹션으로 이동했습니다. 실행 중에 GPU 리소스 사용량이 눈에 띄게 급증했습니다.
문맥상 전후 비교는 다음과 같습니다.

이전:

How a Lottery Quest Led Me to The Powers of PyTorch
GPU 사용량은 1%입니다

이후:

How a Lottery Quest Led Me to The Powers of PyTorch
GPU 사용량이 49%입니다

다양한 n 값에 대한 런타임의 경우 GPU가 몇 배 더 빨랐습니다. 1분 이내에 지속적으로 100 미만의 n 값을 실행했으며 5000(5,000!)

에서 n 값을 계산할 수 있었습니다.

다음은 GPU를 사용하는 런타임 표입니다.

n Time (min and sec)
10 0m13.920s
20 0m18.797s
30 0m24.749s
50 0m34.076s
100 1m12.726s
1000 16m9.831s

이 실험에서 GPU와 CPU 작업 간의 성능 차이가 얼마나 컸는지 시각적으로 파악하기 위해 고려해야 할 데이터 시각화는 다음과 같습니다.

How a Lottery Quest Led Me to The Powers of PyTorch

CPU에서 더 이상 현실적으로 "적시에" 출력을 얻을 수 없어 GPU와 비교할 여지가 없기 때문에 x축이 100으로 제한되었습니다. 1000 - 5000 범위 내의 숫자로 실험을 수행하면 결과적으로 약 "1,440만 번"이 나오는 경우가 많았습니다. 아까부터 그렇게 답변을 받았어요.

주의사항

이 실험에서는 특정 작업 방식을 가정하고 의존했습니다. 또한 PyTorch에 대한 경험이 없다는 것은 잠재적으로 더 효율적인 접근 방식이 있었을 수도 있음을 의미합니다. 다음은 내가 찾은 결과의 정확성이나 실행 시간에 영향을 미쳤을 수도라고 고려해야 할 몇 가지 요소입니다.

  1. 저는 컴퓨터가 생성한 무작위성이 실제 생활(물리적 세계)의 무작위성을 모방한다는 미묘한 가정을 세웠습니다.
  2. PyTorch를 사용하기 위해 로직을 약간 전환했지만 나머지 코드는 여전히 CPU에 의존했습니다. 예를 들어,average_over_n_times() 함수에서 루프의 추가와 평균화 모두 PyTorch와 동등한 기능을 활용했을 수 있습니다. 성능 향상이 있었을 것으로 추측됩니다.
  3. 사용한 배치_크기가 정확성과 성능에 어떤 영향을 미치는지 잘 모르겠습니다.
  4. 컴퓨터가 최상의 상태로 작동할 수 있도록 모든 CPU 및 GPU 테스트는 PC를 연결한 상태에서 수행되었습니다. 배터리 전원을 사용하는 기기로 실행하면 런타임이 더 길어질 수 있습니다.
  5. PyTorch의 CUDA는 "XPU"보다 우위에 있을 수 있지만 내 PC는 XPU를 지원하지 않습니다.
  6. 테스트 중에 PC를 '잠자기' 상태로 두는 것을 피했습니다. 컴퓨터가 절전 모드인 경우 테스트 실행 시간이 더 길어질 수 있습니다.

마지막으로, PyTorch를 어떤 용도로든 처음 사용했는데 성능에 상당히 감동받았다는 점을 말씀드리고 싶습니다.

결론

이것을 가지고 토끼 굴에 빠졌을 때 성능이 이렇게 향상될 것이라고는 예상하지 못했습니다. 저는 텐서 뒤에 있는 아이디어와 훨씬 더 계산적으로 복잡한 작업 뒤에 있는 지원 메커니즘에 대해 몇 가지를 배웠습니다. 코드 조각을 원하는 대로 자유롭게 사용, 복제 또는 수정할 수 있습니다.

좋아해주셔서 감사하고, 재미있게 읽으셨길 바랍니다.

다음 시간까지

건배. ?

위 내용은 복권 퀘스트를 통해 PyTorch의 힘을 알게 된 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.