JuriaHub을 사용하여 여러 노드의 Distributed Computing 테스트
오늘
쥬리아허브 시험으로 분산 계산한 이야기입니다.
JuriaHub의 입문도 여기에 적혀있어요.
이 글은 여러 대의 컴퓨터를 병렬로 사용해 모두가 좋아하는'랜덤으로 원주율을 계산한다'는 것으로, 대학이나 연구기관 등 특별기관에 속하지 않는 일반인이라도 (돈만 내면) 가능하다.
이 글을 쓴 사람은'자기 복부에 라떼 파이 4대를 샀고, LAN 케이블을 연결하는 MPI를 병행해 계산한 파이톤'같은 경험만 있는 흔한 일반인이다. 이보다 많은 노드를 사용하는 컴퓨터 시스템 줄리아 허브는 처음이다.
이 기사를 읽은 사람이 평소 컴퓨터를 하는 사람이 있다면 반드시 주리아허브와 기존 시스템을 비교해 소감을 적어 행복해하는 사람이 있을 거라고 생각했다.
전제 조건
자유자재로 운용하다.
처리할 화제
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분 정도 돌리면 완성되고 구름이 파산해도 된다.총결산
Reference
이 문제에 관하여(JuriaHub을 사용하여 여러 노드의 Distributed Computing 테스트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/terasakisatoshi/articles/48ba3be0944445텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)