Rescale에서 다중 작동점 시뮬레이션의 계산 시간 단축

안드라스블로그2
개요
컴퓨터 시뮬레이션은 다양한 마하 수에서 작동하는 날개의 CFD(전산유체역학) 시뮬레이션이나 다양한 압력비의 제트 엔진 압축기와 같이 시스템이 다양한 조건에서 어떻게 작동하는지 조사하는 데 자주 사용됩니다. 이러한 시뮬레이션은 계산 비용이 많이 들고 수행하는 데 몇 시간에서 며칠이 걸릴 수 있습니다. 해결 시간을 줄이는 한 가지 전략은 더 나은 초기 조건을 사용하여 시뮬레이션을 시작하는 것입니다. 솔버에 최종 솔루션에 "가까운" 초기 조건을 제공함으로써 반복 횟수가 줄어들고 계산 시간이 단축됩니다. 적절한 초기 조건을 제공하면 특히 날개 실속과 같은 복잡한 물리학이 있는 작동 지점에서 시뮬레이션 안정성이 향상될 수 있습니다.
이번 포스팅에서는 약 0.5도의 받음각에서 마하 0.9~3 범위의 날개 주변의 난류를 시뮬레이션하고, 이전 계산 결과를 다음 단계의 초기 조건으로 사용합니다. (예: Mach 0.5에 대한 결과는 Mach 0.6 계산을 초기화하는 데 사용됩니다). 격동하는 ONERA M6 지도 시간 오픈 소스 Stanford University Unstructured(SU2) CFD 솔버의 경우 이러한 계산의 기초로 사용됩니다. 여기에 사용된 메시 및 구성 파일은 SU2에서 가져온 것입니다. Github 저장소. 이전 솔루션을 다음 계산의 입력으로 사용하는 것은 항상 Rescale 인터페이스를 사용하여 가능했지만, 새로운 "사용자 정의 최적화" Python SDK를 사용하면 사용자가 프로그래밍 방식으로 단일 작업 내에서 이 작업을 수행할 수 있습니다.
다음 링크를 사용하여 작업을 복제하거나 보고 따라갈 수 있습니다.
복제 작업
프로젝트 보기
Python 스크립트 개발
첫 번째 단계는 계산을 실행하고 작업에 대한 SU2 구성 파일을 수정하는 Python 스크립트를 개발하는 것입니다. 여기서는 실험 설계 작업에 사용되는 "템플릿 작성"과 유사한 개념이 사용됩니다. Python 스크립트로 값을 채울 수 있도록 input-template.cfg 구성 파일의 여러 줄이 수정되었습니다(마하 수를 설정하려면 아래와 같이). 전체 구성 파일 템플릿은 작업에서 찾을 수 있습니다.

%--- 압축 자유 스트림 정의 ---% % % 마하 수(무차원, 자유 스트림 값 기준) MACH_NUMBER= ${Mach} % % 받음 각도(도, 압축 가능한 흐름에만 해당) AoA = 3.06

계산을 실행하는 데 사용된 Python 스크립트 전체가 아래에 제공됩니다. 그런 다음 각 부분에 대해 논의하고 중요한 개념을 지적하고 제안 사항을 제시할 것입니다. SU2 계산은 다른 계산을 시작하기 위해 특정 "다시 시작" 파일을 생성합니다. 이 다시 시작 파일에는 각 노드 포인트의 솔루션 기본 요소 값이 포함되어 있습니다.

import Optimization_sdk as rescale import os import shutdown CONFIG_TEMPLATE_FILE = 'input-template.cfg' MESH_FILE = 'mesh.su2' # 템플릿을 채우기 위한 도우미 함수 def replacement_in_file(filepath, Pattern, replacement): with open(filepath, 'r') as f: data = f.read() data = data.replace(pattern, replacement) with open(filepath, 'w') as f: f.write(data) # 동작점 정의(마하 단위) op_points = ( 0.5, 0.6, 0.7, 0.8, 0.9) # 전체 실행 횟수 정의 rescale_run = 1 # op_points에서 mach에 대한 작동 지점을 반복합니다: print "Run: %d Mach: %0.4f..." % (rescale_run, mach ) # 입력 템플릿 구성 파일을 복사하고 채웁니다. config_run = 'input-%d.cfg' % rescale_run quitil.copyfile(CONFIG_TEMPLATE_FILE, config_run) replacement_in_file(config_run, "${Mach}", str(mach)) input_files = [config_run , MESH_FILE] # 계산에서 결과 "다시 시작" 파일을 정의 restart_file = 'restart_file_%d.dat' % rescale_run replacement_in_file(config_run, "${Restart-file-out}", restart_file) output_files = [restart_file] # 설정 rescale_run != 1인 경우 솔버가 이전 솔루션에서 다시 시작됩니다. # 다시 시작이 가능합니다. replacement_in_file(config_run, "${Restart}", 'YES') restart_file_previous = 'restart_file_%d.dat' % (rescale_run - 1) input_files.append( restart_file_previous) else: # 첫 번째 실행이므로 다시 시작할 수 없습니다. replacement_in_file(config_run, "${Restart}", 'NO') restart_file_previous = 'none' replacement_in_file(config_run, "${Restart-file-in}" , restart_file_previous) # 컴퓨팅 클러스터에서 SU2를 실행하는 명령을 생성하고 제출합니다! command = 'parallel_computation.py -n $RESCALE_CORES_PER_SLOT -f %s' % config_run run = rescale.submit( command, input_files=input_files, output_files=output_files, var_values={'Mach': mach} ) # 실행이 완료될 때까지 기다립니다. 및 실행 번호 증가 run.wait() rescale_run += 1

첫 번째 블록부터 시작하여,

재조정으로 최적화_sdk 가져오기 import os import shutdown CONFIG_TEMPLATE_FILE = 'input-template.cfg' MESH_FILE = 'mesh.su2'

여기서는 파일 작업에 유용한 Python 모듈 os 및 Shutil을 가져옵니다. 그러나 더 중요한 것은 실행을 제출하는 데 사용되는 Rescale 최적화 SDK입니다. 이 모듈은 사용자 지정 최적화 작업을 실행할 때 Python 경로에 자동으로 배치됩니다. 구성 템플릿과 메쉬의 파일 이름도 선언됩니다.

# 작동점 정의(Mach 단위) op_points = (0.5, 0.6, 0.7, 0.8, 0.9) # 전체 실행 횟수 정의 rescale_run = 1 # 작동점을 통해 루프 for mach in op_points: print "Run: %d Mach: %0.4f..." % (rescale_run, mach) # 입력 템플릿 구성 파일을 복사하고 채웁니다. config_run = 'input-%d.cfg' % rescale_run quitil.copyfile(CONFIG_TEMPLATE_FILE, config_run) replacement_in_file(config_run, "${Mach }", str(mach)) input_files = [config_run, MESH_FILE] # 계산에서 결과 "다시 시작" 파일을 정의 restart_file = 'restart_file_%d.dat' % rescale_run replacement_in_file(config_run, "${Restart-file-out} ", restart_file) 출력_파일 = [restart_file]

이 블록에서는 먼저 각 작동 지점을 나타내는 마하 수 목록을 정의하고 전역 실행 횟수를 정의합니다(rescale_run). 이 실행 횟수는 필수는 아니지만 추적 목적으로 유용합니다. 그런 다음 각 작동 지점을 실행하기 위해 for 루프를 입력합니다. 실행별 구성 파일이 생성되고 원하는 마하 수로 채워집니다. 다음으로 실행을 위한 입력 파일 이름 목록, 즉 구성 파일과 메시 파일을 정의합니다. 이러한 파일은 최적화 노드에서 컴퓨팅 노드로 전송됩니다. 마지막으로 계산을 통해 생성된 "다시 시작" 파일의 이름은 restart_file_.dat로 지정되고 구성 파일에 설정됩니다. 이 다시 시작 파일은 실행이 완료된 후 컴퓨팅 노드에서 최적화 노드로 다시 전송될 출력 파일 목록에 추가됩니다.
나머지 블록은 모두 위에 정의된 for 루프 내에 있습니다.

# rescale_run != 1인 경우 이전 솔루션에서 다시 시작하도록 솔버를 설정합니다. # 다시 시작이 가능합니다. replacement_in_file(config_run, "${Restart}", 'YES') restart_file_previous = 'restart_file_%d.dat' % (rescale_run - 1) input_files .append(restart_file_previous) else: # 첫 번째 실행이므로 다시 시작할 수 없습니다. replacement_in_file(config_run, "${Restart}", 'NO') restart_file_previous = 'none' replacement_in_file(config_run, "${Restart-file- in}", restart_file_previous)

여기에서는 솔버의 초기 조건을 설정했습니다. 최초 실행이 아닌 경우 초기 조건을 설정할 수 있는 재시작 파일이 있습니다. 이 경우 구성 파일은 이전 실행의 다시 시작 파일을 사용하도록 설정되고 이 다시 시작 파일이 입력 파일 목록에 추가됩니다. 처음 실행하는 경우에는 다시 시작 파일을 사용할 수 없으며 이는 구성 파일에 설정됩니다.

# 컴퓨팅 클러스터에서 SU2를 실행하는 명령을 생성하고 제출합니다! command = 'parallel_computation.py -n $RESCALE_CORES_PER_SLOT -f %s' % config_run run = rescale.submit( command, input_files=input_files, output_files=output_files, var_values={'Mach': mach} )

계산을 실행하는 명령은 다음에 정의됩니다. Parallel_computation.py는 멀티 코어 계산을 수행하기 위해 SU2에서 제공하는 Python 래퍼 스크립트입니다. 코어 수를 정의하려면 $RESCALE_CORES_PER_SLOT을 사용하세요. 이 환경 변수는 하드웨어 설정에 따라 자동으로 생성됩니다. 그런 다음 실행될 명령, 입력 및 출력 파일, 마지막으로 이 실행에 대한 변수 값(이 경우에는 마하 수)을 지정하여 실행이 제출됩니다.

# 실행이 완료될 때까지 기다렸다가 실행 번호를 증가시킵니다. run.wait() rescale_run += 1

마지막 블록에서는 for 루프를 계속하고 실행 횟수를 늘리기 전에 실행이 완료될 때까지 기다리도록 스크립트에 지시합니다. 실행에서 다시 시작 파일은 출력 파일로 선언한 대로 컴퓨팅 노드에서 다시 최적화 노드로 자동 전송됩니다.
Rescale에서 작업 실행
Python 스크립트를 개발한 후 이제 Rescale 플랫폼에서 작업을 실행해 보겠습니다. "Job Type"이 "Optimization"으로 설정되고 Python 스크립트, 메시 파일 및 구성 템플릿 파일이 포함된 MachOpPoints.zip zip 파일이 입력 파일로 업로드됩니다.
입력 파일
“Optimizer Settings”에서 “Custom” 옵션과 명령은 Python 스크립트(python runOpPoints.py)를 실행하도록 설정됩니다. SU2도 이 작업의 소프트웨어로 선택되었습니다.
최적화 설정
마지막으로 "하드웨어 설정" 페이지에서 슬롯당 4개의 니켈 코어와 단일 슬롯(계산이 차례로 실행됨)을 선택합니다. 이제 작업을 제출할 준비가 되었습니다!
하드웨어 설정
각 작동 지점은 실행 1의 "하위 실행"(1.1, 1.2...로 표시됨)으로 나타납니다. 각 계산의 파일을 실시간으로 추적할 수 있습니다. 아래 이미지에서는 세 번째 계산(Mach 2)을 위해 SU0.7의 잔여 정보가 포함된 process_output.log 파일을 검사하고 있습니다.
라이브 테일
작업을 완료하는 데 약 5시간이 걸립니다. 완료되면 아래와 같이 “Results” 탭이 나타나고 XNUMX개의 실행을 볼 수 있습니다.
결과 창 전체
두 번째 실행 1.2를 클릭하면 해당 작업과 관련된 파일이 표시됩니다.
run2-결과
Python 스크립트에서 생성된 input-2.cfg 구성 파일과 이전 실행의 재시작 파일 restart_file_1.dat가 표시됩니다. process_output.log 파일을 검사하면 다음 줄이 표시됩니다.

restart_file_1.dat에서 흐름 솔루션을 읽어보세요.

재시작 파일의 초기 조건을 사용하여 계산이 시작되었음을 확인합니다.
Rescale의 플랫폼에 대한 더 많은 정보에 관심이 있으시면 info@rescale.com으로 문의해 주세요.

비슷한 게시물