Pioneer
SCALE-SIM 뜯어보기 (2): 실행 진입점과 scalesim 본문
실행 진입점?
그냥 main(..) 함수라는 의미다.
이 역시 알만한 사람들일테니 명령행 인자가 어떻고, 파이썬은 조건문을 사용해서 어떻게 정의하고 이런 것은 생략한다.
코드 분석은 웬만하면 블록 단위(함수, 클래스, 반복문 등)으로 하되, 짧을 경우는 예외.
1. 실행 진입점
import argparse
from scalesim.scale_sim import scalesim
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-t', metavar='Topology file', type=str,
default="../topologies/conv_nets/test.csv",
help="Path to the topology file"
)
parser.add_argument('-c', metavar='Config file', type=str,
default="../configs/scale.cfg",
help="Path to the config file"
)
parser.add_argument('-p', metavar='log dir', type=str,
default="../test_runs",
help="Path to log dir"
)
parser.add_argument('-i', metavar='input type', type=str,
default="conv",
help="Type of input topology, gemm: MNK, conv: conv"
)
args = parser.parse_args()
topology = args.t
config = args.c
logpath = args.p
inp_type = args.i
gemm_input = False
if inp_type == 'gemm':
gemm_input = True
s = scalesim(save_disk_space=True, verbose=True,
config=config,
topology=topology,
input_type_gemm=gemm_input
)
s.run_scale(top_path=logpath)
6-32: 명령행 인자를 처리
34: scalesim 인스턴스 s를 생성
39: s의 메서드 run_scale 호출
2. 클래스 scalesim
import os
from scalesim.scale_config import scale_config
from scalesim.topology_utils import topologies
from scalesim.simulator import simulator as sim
이걸 보니 다음 코드 분석 파일을 무엇으로 해야할지 느낌이 온다.
class scalesim:
def __init__(self,
save_disk_space=False,
verbose=True,
config='',
topology='',
input_type_gemm=False):
# Data structures
self.config = scale_config()
self.topo = topologies()
# File paths
self.config_file = ''
self.topology_file = ''
# Member objects
#self.runner = r.run_nets()
self.runner = sim()
# Flags
self.read_gemm_inputs = input_type_gemm
self.save_space = save_disk_space
self.verbose_flag = verbose
self.run_done_flag = False
self.logs_generated_flag = False
self.set_params(config_filename=config, topology_filename=topology)
init 메서드는 이름답게 클래스의 속성 전부를 초기화한다.
9-15: config_file과 topologies 파일을 받아 처리할 인스턴스를 생성하고 파일 경로 변수를 생성해둔다.
19: 실제로 시뮬레이션을 수행할 인스턴스 생성
21-26: 각종 플래그 초기화
28: 파라미터 세팅. 정확히는 입력된 두 개의 파일을 유효성 검증하고 해당 파일에 적힌 파라미터로 Array를 세팅한다.
(21-26)의 각 플래그의 용도를 변수명으로 유추해보면:
read_gemm_inputs: gemm의 mnk 포맷 입력을 읽을 것인지
save_space: True면 디스크 공간 절약을 하겠다?
verbose_flag: 터미널에 진행 과정을 계속 표시할 것인가
run_done_flag: 시뮬레이션이 끝났는가
logs_generated_flag: 로그가 생성되었는가
2.1. set_params(..)
앞선 __init__(..) 내부에서 호출되는 메서드
#
def set_params(self,
config_filename='',
topology_filename='' ):
# First check if the user provided a valid topology file
if not topology_filename == '':
if not os.path.exists(topology_filename):
print("ERROR: scalesim.scale.py: Topology file not found")
print("Input file:" + topology_filename)
print('Exiting')
exit()
else:
self.topology_file = topology_filename
if not os.path.exists(config_filename):
print("ERROR: scalesim.scale.py: Config file not found")
print("Input file:" + config_filename)
print('Exiting')
exit()
else:
self.config_file = config_filename
# Parse config first
self.config.read_conf_file(self.config_file)
# Take the CLI topology over the one in config
# If topology is not passed from CLI take the one from config
if self.topology_file == '':
self.topology_file = self.config.get_topology_path()
else:
self.config.set_topology_file(self.topology_file)
# Parse the topology
self.topo.load_arrays(topofile=self.topology_file, mnk_inputs=self.read_gemm_inputs)
#num_layers = self.topo.get_num_layers()
#self.config.scale_memory_maps(num_layers=num_layers)
두 파일 경로의 유효성을 검사하고, configuration과 topology를 세팅한다.
라인별 분석은 필요 없어 보인다.
2.2. 그 외
#
def run_scale(self, top_path='.'):
self.top_path = top_path
save_trace = not self.save_space
self.runner.set_params(
config_obj=self.config,
topo_obj=self.topo,
top_path=self.top_path,
verbosity=self.verbose_flag,
save_trace=save_trace
)
self.run_once()
시뮬레이터를 실행하는 함수의 진입점.
scale.py에서 호출되어 run_once를 호출한다.
이전 글에서 마지막에 테스트 실행 시 trace파일이 생성되지 않는다라고 얘기 했었는데, 왜 그런지 알겠다.
소스 코드를 수정하지 않는다면, save_trace가 False로 전달되기 때문이다.
그렇다면 __init__에서 이와 관련된 플래그가 왜 save_disk_space인지도 알겠다.
SCALE-SIM이 출력하는 것은 cycle accurate trace기 때문에 디스크 용량을 많이 차지할 수 있기 때문이다.
결론적으로 SCALE-SIM 실행 후 trace도 확인하고 싶다면 scale.py 34번 줄의 save_disk_space를 False로 바꾸면 된다.
(단, 레이어 5개 짜리 토폴로지도 trace 파일은 300MB 정도가 생성되니 주의!)
def run_once(self):
if self.verbose_flag:
self.print_run_configs()
#save_trace = not self.save_space
# TODO: Anand
# TODO: This release
# TODO: Call the class member functions
#self.runner.run_net(
# config=self.config,
# topo=self.topo,
# top_path=self.top_path,
# save_trace=save_trace,
# verbosity=self.verbose_flag
#)
self.runner.run()
self.run_done_flag = True
#self.runner.generate_all_logs()
self.logs_generated_flag = True
if self.verbose_flag:
print("************ SCALE SIM Run Complete ****************")
sim 인스턴스를 실행시키는 메서드
그외 실행과 관련된 플래그를 변경
그 아래 2개 메서드는 각종 성능 지표를 출력해서 보여주는 것 정도로 알면 될 듯하다.
다음에는 토폴로지 관련 메서드가 정의된 코드를 분석할 것이다.
'HPC > SCALE-SIM' 카테고리의 다른 글
SCALE-SIM 뜯어보기 (6): single_layer_sim.py (0) | 2024.11.26 |
---|---|
SCALE-SIM 뜯어보기 (5): simulator.py (0) | 2024.11.15 |
SCALE-SIM 뜯어보기 (4): scale_config.py [pt.1] (0) | 2024.11.14 |
SCALE-SIM 뜯어보기 (3): topology_utils.py [pt.1] (0) | 2024.11.13 |
SCALE-SIM 뜯어보기 (1): 설치 및 테스트 (0) | 2024.11.08 |