Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Pioneer

SCALE-SIM 뜯어보기 (2): 실행 진입점과 scalesim 본문

HPC/SCALE-SIM

SCALE-SIM 뜯어보기 (2): 실행 진입점과 scalesim

hwkang 2024. 11. 12. 19:20
실행 진입점?

 

그냥 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를 호출한다.

 

 

SCALE-SIM 뜯어보기 (1): 설치 및 테스트

SCALE-SIM이 뭔가요? SCALE-SIM은 Systolic CNN AcceLErator SIMulator의 약자이다. 쉽게 말해, CNN 연산을 가속하기 위해 Systolic array를 사용하는 것을 시뮬레이션 해볼 수 있는 도구다. 그럼 그 다음 질문으로,S

hwkang4snn.tistory.com

 

 

이전 글에서 마지막에 테스트 실행 시 trace파일이 생성되지 않는다라고 얘기 했었는데, 왜 그런지 알겠다.

 

소스 코드를 수정하지 않는다면, save_traceFalse로 전달되기 때문이다.

 

그렇다면 __init__에서 이와 관련된 플래그가 왜 save_disk_space인지도 알겠다.

 

SCALE-SIM이 출력하는 것은 cycle accurate trace기 때문에 디스크 용량을 많이 차지할 수 있기 때문이다.

 

결론적으로 SCALE-SIM 실행 후 trace도 확인하고 싶다면 scale.py 34번 줄의 save_disk_spaceFalse로 바꾸면 된다.

(단, 레이어 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개 메서드는 각종 성능 지표를 출력해서 보여주는 것 정도로 알면 될 듯하다.


다음에는 토폴로지 관련 메서드가 정의된 코드를 분석할 것이다.