JuriaHub을 사용하여 여러 노드의 Distributed Computing 테스트

19299 단어 Juliajuliahubtech

오늘


쥬리아허브 시험으로 분산 계산한 이야기입니다.
JuriaHub의 입문도 여기에 적혀있어요.
이 글은 여러 대의 컴퓨터를 병렬로 사용해 모두가 좋아하는'랜덤으로 원주율을 계산한다'는 것으로, 대학이나 연구기관 등 특별기관에 속하지 않는 일반인이라도 (돈만 내면) 가능하다.
이 글을 쓴 사람은'자기 복부에 라떼 파이 4대를 샀고, LAN 케이블을 연결하는 MPI를 병행해 계산한 파이톤'같은 경험만 있는 흔한 일반인이다. 이보다 많은 노드를 사용하는 컴퓨터 시스템 줄리아 허브는 처음이다.
이 기사를 읽은 사람이 평소 컴퓨터를 하는 사람이 있다면 반드시 주리아허브와 기존 시스템을 비교해 소감을 적어 행복해하는 사람이 있을 거라고 생각했다.

전제 조건

  • JuriaHub에 등록되어 신용카드 인증을 받은 상태
  • 간단한 Juria 코드 설명 및 실행 가능

  • 자유자재로 운용하다.
  • 처리할 화제


    Distributed.jl를 토대로 이야기를 나누다.모두들 좋아하는 랜덤수에 따라 원주율을 계산한다.
    [1]\times[1]\subset\mathb{R}^2의 영역에서 무작위 생성점(x, y)\in\mathb{R}^2.이 생성을 n회 반복합니다.모든 시험에서 발생하는 점 반경이 하나의 원에 속하는지 관측하다.그 상황을 묘사한 것은 아래의 그림이다.

    녹색:원 루프의 점, 빨간색:원 밖의 점
    그림은 아래 링크에서 발췌한다
    JuriaHub 자습서
    원의 면적을 구역의 면적으로 나눈 수치는\pi/4이다
    4(円の中に入った点の数)/n
    
    는 원주율의 근사함으로 볼 만하다.

    준비할 코드


    독자들이 JuriaHub의 튜토리얼을 모방할 수 있도록 핵심 논리는
    https://help.juliahub.com/juliahub_tutorials/vscode_extension/#executing_a_script
    이렇게 써.방침은 단지 아래의 계산만을 집행할 뿐이다
    x, y = rand() * 2 - 1, rand() * 2 - 1
    Int(x^2 + y^2 <= 1)
    
    이 논리는 여러 대의 기계로 독립적으로 계산할 수 있기 때문에 분산 계산 연습에 있어서 좋은 소재이다.
    다음 코드는 calcpi.jl로 잠시 저장됩니다.
    calcpi.jl
    using Distributed
    
    function estimate_pi_distributed(n)
        n > 0 || throw(ArgumentError("number of iterations must be > 0, got $n"))
        incircle = @distributed (+) for i in 1:n
            x, y = rand() * 2 - 1, rand() * 2 - 1
            Int(x^2 + y^2 <= 1)
        end
        return 4 * incircle / n
    end
    
    function main()
        @show nprocs()
        @show estimate_pi_distributed(1024)
    
        for k in 1:13
            n = Int(exp10(k))
            ret = @timed estimate_pi_distributed(n)
            @info "progress logging:" k=k n=n elapsed_time=ret.time log10_elapsed_time=log10(ret.time) pi_approx=ret.value
        end
    end
    
    main()
    

    휴대용 PC에서 실행


    동작을 확인하기 위해 손 옆에 있는 기계에 실행해 보세요.
    	    _
       _       _ _(_)_     |  Documentation: https://docs.julialang.org
      (_)     | (_) (_)    |
       _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
      | | | | | | |/ _` |  |
      | | |_| | | | (_| |  |  Version 1.6.6 (2022-03-28)
     _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
    |__/                   |
    
    julia> versioninfo()
    Julia Version 1.6.6
    Commit b8708f954a (2022-03-28 07:17 UTC)
    Platform Info:
      OS: macOS (x86_64-apple-darwin18.7.0)
      CPU: Intel(R) Core(TM) i9-9980HK CPU @ 2.40GHz
      WORD_SIZE: 64
      LIBM: libopenlibm
      LLVM: libLLVM-11.0.1 (ORCJIT, skylake)
    
    julia -p auto calcpi.jl
    
    을 실행해 보세요. 시작-p 数에서 지정한 수량의 여러 프로세스를 병행 실행해서 계산합니다.auto 논리적 핵심 부분만 나온다.
    손에 있는 출력은 다음과 같습니다. (끝나지 않았기 때문에 중도에 정지합니다.)
    julia -p auto calcpi.jl
    nprocs() = 17
    estimate_pi_distributed(1024) = 3.2265625
    ┌ Info: progress logging:
    │   k = 1
    │   n = 10
    │   elapsed_time = 0.00547458
    │   log10_elapsed_time = -2.261649193506851
    └   pi_approx = 3.6
    ┌ Info: progress logging:
    │   k = 2
    │   n = 100
    │   elapsed_time = 0.003604553
    │   log10_elapsed_time = -2.4431485843897405
    └   pi_approx = 3.2
    ┌ Info: progress logging:
    │   k = 3
    │   n = 1000
    │   elapsed_time = 0.001483053
    │   log10_elapsed_time = -2.828843328272869
    └   pi_approx = 3.172
    ┌ Info: progress logging:
    │   k = 4
    │   n = 10000
    │   elapsed_time = 0.001327724
    │   log10_elapsed_time = -2.8768921943464734
    └   pi_approx = 3.138
    ┌ Info: progress logging:
    │   k = 5
    │   n = 100000
    │   elapsed_time = 0.001279914
    │   log10_elapsed_time = -2.892819210492916
    └   pi_approx = 3.14728
    ┌ Info: progress logging:
    │   k = 6
    │   n = 1000000
    │   elapsed_time = 0.001757383
    │   log10_elapsed_time = -2.7551335790511238
    └   pi_approx = 3.140364
    ┌ Info: progress logging:
    │   k = 7
    │   n = 10000000
    │   elapsed_time = 0.012431846
    │   log10_elapsed_time = -1.9054643783504694
    └   pi_approx = 3.1405128
    ┌ Info: progress logging:
    │   k = 8
    │   n = 100000000
    │   elapsed_time = 0.105849097
    │   log10_elapsed_time = -0.9753128426005442
    └   pi_approx = 3.14166212
    ┌ Info: progress logging:
    │   k = 9
    │   n = 1000000000
    │   elapsed_time = 1.036959515
    │   log10_elapsed_time = 0.01576180098371608
    └   pi_approx = 3.141531148
    ┌ Info: progress logging:
    │   k = 10
    │   n = 10000000000
    │   elapsed_time = 10.796728385
    │   log10_elapsed_time = 1.0332921758951752
    └   pi_approx = 3.1416026752
    ┌ Info: progress logging:
    │   k = 11
    │   n = 100000000000
    │   elapsed_time = 132.697088801
    │   log10_elapsed_time = 2.1228613951211797
    └   pi_approx = 3.1415873828
    
    CPU 사용률을 살펴보면 각 코어가 필사적으로 일하는 모습을 엿볼 수 있다.
    안타깝게도 기계 한 대k=12, 13의 결과는 바로 얻기 어렵다.

    이제 JuriaHub 차례입니다.


    여러 대의 컴퓨터로 계산
    x, y = rand() * 2 - 1, rand() * 2 - 1
    Int(x^2 + y^2 <= 1)
    
    한 후에 그것을 합치면 되죠?
    네, 그런데 누가 컴퓨터를 여러 대 준비했어요?하기 싫죠?
    쥬리아허브를 사용하면 버튼 하나로 여러 대의 컴퓨터를 준비한 듯한 환경을 만들 수 있다.

    Job List로 이동


    JuriaHub에 로그인하면 화면 오른쪽 위에 있는 메뉴COMPUTE부터 시작합니다Job List.
    Start job 버튼을 누릅니다.

    Submit Job 조정


    몇 개의 노드(컴퓨터 대수)를 연결하여 계산할 파라미터를 지정하다
    Start a distributed CPU job with 2 vCPUs per node and 4 GB of memory per vCPU with one Julia process for each vCPU.
    
    각 컴퓨터에 필요한 성능을 지정합니다.즉
    Number of Nodes는 여기서 64로 설정합니다.이렇게 하면 resulting in 127 worker process 작은 주의사항이 표시됩니다.여기, 주의는127 = 2 x 64 - 1입니다.
    이렇게 하면 127개의 계산 요정을 조종할 수 있다.여기에 요정을 조종할 수 있는 보스nprocs()를 준비했으니 127+1=128이다.

    Limit by 설정


    JuriaHub은 쓰는 돈만 받아요.여기는 hour 한 개만 사용합니다.저는 닭고기인데 중간에 멈췄어요. 줄리아 허브를 정확하게 조작할 수 있다면 높이 밖에 안 들 거예요$10.88.

    코드 설정

    # Write code or drop a file here.에 상술한 실행 코드를 직접 붙여넣습니다.
    이번 코드는 표준 라이브러리만 있으면 되기 때문에 지정할 필요가 없다Project TOML file 등.외부 라이브러리 사용 시 ProjectToml을 손으로 만들어 올려야 합니다.

    여기까지의 상태.


    이상의 설명에 따르면 여러분의 손 옆에 있는 화면은 아래의 이런 화면이어야 합니다.

    각오 되셨나요?Start 버튼을 누르세요.

    난쟁이!!


    Start 버튼을 눌러 작업을 수행합니다.

    잠시 후 Job List 페이지로 돌아갑니다. 아래와 같이 모래시계 표시가 있는 목록이 나열되어 있습니다.

    로그 화면

    Logs의 링크를 누르면 작업 수행 과정에서 발생하는 출력을 감시할 수 있습니다.

    64개의 노드를 생성하는 데 시간이 걸립니다^^;.

    @ info가 편한데요?


    아까 코드에 맥로가 삽입된 걸 생각해봐.
    1 台のマシンには2つ仮想CPUが積んでいる. メモリは 2x4=8GB.
    1つの仮想CPUに対してJuliaの1プロセスが割り当てられる
    
    이걸 코드에 쓰면 출력값을 기록할 뿐만 아니라 JuriaHub도 이 값을 모아 도표를 만든다.
    그림% 1개의 캡션을 편집했습니다.

    여기, @info 부분의 하단값X:은 Y:n이죠.

    이렇게 하면 아래의 선형으로 뻗은 도표를 볼 수 있겠지.

    이는 실행 시간과 순환 횟수elapsed_time의 실험이 정비례한다는 것을 의미한다.

    수중의 환경과 비교하다


    그렇다면 X축을 n = 10^k로 설정하면 값이 커서 상상하기 어렵다. 따라서 X축의 값을 n로 변경한다.

    마우스가 교차하는 곳k에서 6초면 끝이야.
    참고로 수중 환경의 일지를 돌이켜 보면 다음과 같다k = 11많은 요정들이 일하는 JuriaHub의 성능이 대단합니다.
    @info "progress logging:" k=k n=n elapsed_time=ret.time log10_elapsed_time=log10(ret.time) pi_approx=ret.value
    
    그렇다면 손 옆에 있던 기계가 계산하지 못한 elapsed_time = 132.697088801 상자가 줄리아허브라면 각각 60초와 600초 정도면 된다.
    k = 12, 13의 모든 임무를 13분 정도 돌리면 완성되고 구름이 파산해도 된다.

    총결산

  • 병렬 계산 스크립트를 설명하고 JuriaHub로 실행했습니다.
  • 수중에 확인하기 어려운 규모라도 노드 수 폭발을 통해 실제 시간과 돈으로 계산할 수 있다.
  • 줄리아 허브의 무료 한도는 25달러이기 때문에 한 번 정도면 이동할 수 있을 것 같아요
  • 처음에도 썼는데 평소에 컴퓨터를 사용하는 사람이 있다면 이 기회를 빌려 사용해 본 소감을 공유할 수 있어서 기쁘다.
  • 좋은 웹페이지 즐겨찾기