Taso : graph optimization 방법론

graph-level optimization
이현준's avatar
Mar 17, 2024
Taso : graph optimization 방법론

TASO

기존에 존재하는 Rule-based optimization 방법에서는 3개의 단점이 존재한다.
기존에는 Computation time을 equivalent transformations을 computational graph에 진행하면서 줄였다. 이 논문에서는 optimal equivalent transformation을 적용하는 방법에 대해 제안한다.
 

Define 1. Equivalent Transformation

notion image
notion image
위 자료 왼쪽을 통해서 보면, transpose의 위치가 바뀐 것을 볼 수 있다. 또한, source graph와 target graph의 결과는 여전히 동일하다. 또한, 오른쪽 자료를 살펴보면 matrix 인 B와 C를 concat하는 graph로 바뀌면서 computation time을 줄일 수 있다.
당시 프레임워크인 Tensorflow, pytorch, Tensorrt, TVM 등에서 제안하는 equivalent transformation은 위와 같다. 그런데 이런 transformation을 직접 정의해야 하는 것이 단점이다.

Define 2. Data Layout

  • Data layout은 multi-dimensional Array형태를 저장할 수 있는 방법을 의미한다.
  • Tensor 가 가질 수 있는 Data layout은 크게 2가지가 있다.
      1. Row-Major
      1. Column-Major
  • Data layout은 하드웨어와 operator의 성능에 따라 달라진다.
    • V100에서의 예시를 살펴보자.
      • 4X4 matrix operation을 제공하는 tesla V100같은 경우, 4X4로 tensor를 자르는 것이 효율적이다.
 

이전 Equivalent transformation

Problem 1 : Manual Definition은 scalability가 낮다.

  1. Maintainability
      • 많이 복잡한 알고리즘 혹은 operator가 생기면 새로운 가이드를 생성해야해서 유지보수가 크다.
  1. Correctness
      • 인간이 만든 Rule 이어서 오류가 발생할 수 밖에 없다.
      notion image

Problem 2 : 현존하는 프레임워크에서 optimization 방법은 최적의 optimization opportunity를 잃을 수 있다.

notion image
위 과정은 실제로 tensorflow와 tvm에서 진행되는 방법이다.
실제로 Data layout transformation과 Graph Substitution을 동시에 적용하려고 하면 기존 프레임워크에서는 complexity가 높아져서 고려를 안한다. 가령, 특정 Graph substitution은 Data layout optimizing을 같이 적용해야 성능이 올라가는데 이런 상황을 아예 고려 안했다고 볼 수 있다. 그래서 sequential한 처리로 computation graph 최적화가 만들어진 것이다.
notion image
실제로 equivalent transformation과 Data Layout Transformation을 같이 진행하니(joint optimization) Execution time이 제일 줄어든 것을 확인할 수 있다.
💡
그래서 TASO 제안했다.
Abstract에서 소개된 TASO의 특징
  • 제공된 operator들을 사용하여 substitution 후보군을 생성
  • operator specification 리스트를 사용하여 생성된 substitution graph verification 진행 ( Theorem prover Z3)
  • cost-based backtracking algorithm을 사용하여 optimized graph를 찾는다.
 
Abstract에서 소개된 결과
  1. tensorflow의 manual optimization rules가 53,000줄 구현된 것을 TASO에서는 1,400 줄로 구현된 것만 갖고 진행
  1. 이전 방법론들보다 인력이 덜 쓰이면서 2.8X 성능 향상
 

접근 방법

notion image
  1. Substitution 생성
      • Taso에서 Graph substitution Generator는 Computation Graph의 모든 가능한 substitution candidate를 생성한다.
      • 이때 제공된 DNN operator들을 가지고 Fixed size(최대 4개)까지 생성한다.
      • 이후 random input tensor를 가지고 같이 fingerPrint(Output)에 기반하여 substitution graph를 hash table에 저장한다.
  1. Substitution 검증 with theorem prover
      • 1번 단계에서 생성된 substitution graph들을 검증하는 과정이다.
      • 이때 위 자료처럼 operator specifications들을 활용한다.
        • operator들의 property 중 mathematical computation 등을 참고한다.
  1. Joint optimization
      • Graph substitution과 data layout transformation을 같이 묶어서 진행한다.
      • Metaflow에서 제안된 cost-based backtracking search algorithm을 사용한다.
      • 하드웨어마다 달라지는 data layout cost도 고려한다.

2. Graph substitution Generator

  • primitive operator들이 제공되면 potential한 substitution들을 자동으로 만든다.
    • 이때 특정 size만큼의 substitution들을 만드는데 여기서는 보통 4개의 operator들을 묶음으로 만든다.
  • 가장 적합한 substitution을 만드는데, naive한 방법은 두 개씩 pair로 enumerate하면서 비교하는 방법이다.
    • 하지만 이렇게 되면 quadratic한 time consumption이 발생하기에 더 효과적인 방법으로 아래와 같이 진행한다.
      • 💡
        superoptimization[7]의 아이디어와 substitution graph마다fingerprint라는 값을 계산한다.
        → 이후 같은 fingerprint 값을 갖는 graph들끼리 비교하여 비교 시간을 줄인다.
        → TASO에서 구현한대로 같은 fingerprint를 갖는 graph들을 서로 equivalent한 graph라는 전제가 깔려있다.
 

2-1. Graph Substitution Definition

  • Graph Substitution 은 3가지의 구성요소로 나뉜다.
      1. Source Graph
          • 원본 computation graph의 subgraph
      1. Target Graph
          • Source graph와 Equivalent한 새로운 subgraph
      1. Mapping Relation
          • source graph와 target graph의 input, output tensor 정보
💡
Graph substitution은 tensor들의 실제 shape과 특정 configuration parameter들에 영향 받지 않는다.
  1. Tensor Shape
    1. notion image
      • 위 figure처럼 A,B,C에 대해 어떤 tensor shape인지들을 제한하지 않는다.
  1. Configuration Parameter
      • i.e. Convolution operator를 사용할 때 strides, padding, activation 등이 Configuration parameter로 사용된다.

2-1-2. Concatenation and split operators

notion image
  • 위 figure처럼 같은 input을 공유하는 경우에 concatenation 과 split operator들이 사용된다.
  1. split operator
      • 하나의 tensor를 2개의 disjoint한 tensor로 분리한다.
      • 이때 parameter로 제공된 dimension을 기준으로 분리한다.
      • 하지만 split operator를 언제 사용해야 하는지 결정해야 하는데 이는 input tensor, parameter들로 알 수 없다.
      💡
      그런데 실험을 통해 split operator는 이전에 concatenation operator가 불러진 곳에 사용된다는 것을 알게 되었다.→ 가장 최근의 concatenation operator를 ‘undo’하기 위해서 split operator를 사용하기 때문이다.
      → 이 점을 착안하여 concatenation history를 split tree 를 사용
  1. split tree
    1. notion image
      • tensor의 차원마다 생성하는 metadata
      • Figure3을 통해서 row dimension들에 대한 split tree를 생성하는 예시를 볼 수 있다.
        • source graph와 다르게 target graph에서는 concat과 split operator가 존재하는 것을 볼 수 있다.
        • 이때 split tree(gray box)를 살펴보면 concat이 row 차원에서 일어난 것을 확인할 수 있고, 이 정보를 활용해서 split은 matmul 연산 이후에 추가해준다.
        • 이를 통해서 equivalent한 target graph가 생성되는 것을 볼 수 있다.
      💡
      split tree를 사용하여 split point를 하기 위한 추가 parameter들이 요구되지 않는다.

2-2 Generation Algorithm

notion image

Step 1. Violent enumeration for potential graph with fingerprint

step 1에서는 potential한 graphs들을 우선 찾는다.
현재 생성된 graph에 다음으로 올 operator는 operator type과 operator의 input tensor를 살펴보고 추가한다.
위 알고리즘 내용 중 line 7-18까지가 step1의 내용이다. DFS 알고리즘을 사용해서 acyclic computation graph들에 대해 계속 탐색하는 알고리즘이다.
이때 같은 input tensor에 대해서 같은 computation을 진행하는 graph를 duplicated computation이라고 숙지하고 있고, 각 graph마다 fingerprint 를 수집한다.
Fingerprint란, 각 graph들의 ouput tesnor를 해싱한 값이다. FingerPrint를 계산하는 과정에서 floating-point error를 방지하고자 모든 tensor들은 integer로 표현된다.
💡
이때 floating point error가 나타나는 경우를 살펴보자. fingerprint는 다음과 같이 정의된다.
→ 수식을 확인해보면, hash를 2번 사용한 것을 볼 수 있다.
  1. inner hash의 경우 graph에 대한 output 결과들을 hash 형태로 만든 것이다.
      • 이때 size, shape, tensor 정보를 사용해서 hashing을 진행한다.
  1. outer hash의 경우, 어떤 순서로 output들이 나열되어도 같은 fingerprint라고 인식할 수 있게 하기 위해 사용된다.
      • 이때 outer hash는 symmetric hash function으로 사용되어 unordered set of hash values에게 적용된다.
💡
hash 사용하기 때문에 floating이 아니라 integer를 사용하는 것 같다. https://dassencio.org/98 → floating point는 key 값으로 사용되면 안된다.
 
 

step 2. Testing graph with identical fingerprint

step 2에서는 우선 같은 fingerprint값을 가진 graph들끼리 2개씩 묶어서 결과값을 비교하게 한다. 이때 input tensor는 fingerprint를 구할 때와 다르게 -1에서 1사이의 float로 구성되어 있다. 그리고 graph들의 output의 차이가 10^-5이라면 equivalent 한 graph라고 판단한다.
💡
step 2에서는 같은 output을 가진 graph들을 다시 확인하는 과정이라고 보면 된다. → step 2 이후 graph들을 모두 3. graph substitution verifier 단계로 넘어간다.
현재까지 제안한 알고리즘은 generic하지만, 논문에서 이 섹션에서 2가지 operator는 special 케이스라고 소개했다.
  1. Relu
      • Often Returns 0.
        • → 때문에 불필요한 graph substitution이 후보군으로 생성된다.
      • 해결 방법으로 아래 operator로 교체
    1. Enlarge
        • Zero padding: 다른 conv 연산끼리 fusing하는데 사용
        • 0이 너무 많아서 불필요한 substitution candidate들 생성
        • 이 문제를 해결하기 위해 input tensor를 Enlarge operator에 넣는 경우만 고려하고, 다른 operator의 Output이 input으로 들어오는 Enlarge의 경우는 모두 없앴다.
     
     

    3. Graph substitution Verifier

    이 step에서 point는 유저가 제공해주는 first-order logic으로 표현된 소량의 operator property를 통해 candidiate graph substitution 들을 검증한다.
    First-order logic으로 표현한다? 아래의 예시를 살펴보자.
    위 표현식은 Convolution operator의 tensor x, y, s for stride parameter, c for activation mode, p for padding mode 를 표현한다. 더 이어서 수식을 살펴보자.
    convolution에서 activation 을 아예 사용 안한다고 하면 위와 같이 none 첨자를 붙여서 표현한다.
    위 수식은 항상 참이라는 것을 알 수 있다.
    논문에서는 제공되는 Table 1은 evaluation에서 사용되는 모든 operator와 tensor constant들의 리스트를 제공하고 Table2는 operator property들을 제공한다.
    이 operator property들은 Z3 first-order theorem prover를 사용하여 생성된 substitution들을 검증한다.
     
    First-order logic이란?
    논리학에서 배운 First-order logic을 간단히 짚고 넘어가겠다.
    💡
    X is greater than 3.
    위 문장에서 x는 값이 정해지지 않아 변수(Variable or Free Variable)이라고 함.
    이때 변수가 포함된 문장을 명제함수(propositional function)/Predicate 이라고 정의하고 P(x)라고 표현
    • 위 예제 문장을 명제함수로 만든다면 : P(x) = x> 3
    • 변수 x에 따라 참, 거짓을 판별할 수 없기 때문에 명제가 아니다.
    • 변수에 특정 값을 대입하면 참, 거짓을 판정할 수 있다.
    • 명제논리와 다르게 위와 같은 명제함수가 포함된 논리를 1차 논리, predicate logic이라고 부름
    → 명제함수를 명제로 만드는 방법은 아래와 같이 2가지 있다.
    1. 변수에 특정 값을 넣는다.
        • 만약 x=10이면 P(x)는 True일 것이고, x=1이면 False일 것이다.
    1. quantification : 범위를 제한한다.
        • 만약 x≥4 라면 p(x)는 항상 True다.
        quantifier란?
        • 한정자라고도 불리며, 명제함수에서의 변수의 범위를 제한하는 연산자다.
            1. 전체한정자 ( Universal Quantifier)
              1. 존재한정자 ( Existential Quantifier)
            • 마지막으로 수학 정리의 기술 예시를 살펴보자.
              • notion image
        Z3 prover란?
        • Z3은 microsoft에서 개발한 수치 해석 도구로 방정식과 같은 수학적 요소들을 해결하는데 쓰인다.
          • from z3 import * >>> x = Int('x') >>> y = Int('y') >>> solve(x>2, y<10, x+2*y==7) [y = 0, x = 7]
        • Z3 prover는 SMT solver의 한 종류라고 보면 된다.
         
        그럼 SMT Solver는 뭘까?
        TL;DR : 복잡한 arithmetic 연산을 조건으로 하는 로직 분석 시 도움이 될 수 있는 방법론
        SMT Solver는 SAT 와 같은 다른 Solver들과 다르게 복잡한 속성을 가진 소프트웨어/하드웨어의 정확성 검증할 때 쓰인다. 즉, 소프트웨어 검증까지 진행할 수 있는 표현력이 높은 논리적 구조로 표현할 수 있다.
        SAT solver는 가장 기본적인 논리 문제를 다루는데 쓰인다면 SMT Solver는 더 복잡한 문제들을 푸는데 사용한다. 예를 들면 x+y>5 와 같은 수학적 조건을 생각하자면 이를 충족하는 x,y가 존재하는지 판단할 수 있다.
        실제로 기본 산술 문제, 배열 요소 접근, bit vector 등의 문제들을 해결할 수 있다.
        더 자세한 예시는 없을까?
        → 실제로 python z3 package를 사용해서 정수 변수 (x), (y)에 대해서 (x+y>5) 그리고 (x<3) 조건을 만족하는 값이 있는지 확인해보겠다.
        # 변수 선언 x = Int('x') y = Int('y') # SMT 솔버 초기화 solver = Solver() # 조건 추가 solver.add(x + y > 5, x < 3) # 충족 가능성 확인 is_satisfiable = solver.check() # 결과 출력 if is_satisfiable == sat: model = solver.model() print("문제에 대한 해:", model) else: print("해결 불가능한 문제")
        notion image
        Key point는
        1. Solver 모델 초기화
        1. Solver 모델에 조건을 추가
        1. solver가 조건을 check한다.
        1. sat object가 나오면 문제에 대한 해가 존재한다.
         

        Operator Properties 개발

        • 본래 operator property들은 생성된 graph substitution들이 잘 생성되었는지를 검증하기 위해 user단에서 제공해야 한다.
        • 개발 과정에서 검증이 안되고 생성이 되는 경우들이 발생하여 validation step 을 추가했다.
         

        4. Pruning Redundant Substitution

        step 4에서는 불필요한 substitution들을 찾아서 제거한다. 만약 graph G가 G’으로 일련의 substitution들을 적용하여 변환될 수 있다면, 모든 pruning은 substitution을 해치지 않는다.
        1. Input tensor naming
            • TASO는 substitution 그래프 중 다른 input name이 붙여졌지만 사실은 같은 input tensor 값을 넣는 경우, naming을 통일한다.
            • 가령 왼쪽에 제안된 tensor C가 사실은 A랑 같은 tensor라면 오른쪽처럼 A로 통일된다.
        notion image
        notion image
        1. Common Subgraph
            • TASO에서는 source graph와 target graph가 같은 subgraph가 존재하면 pruning을 진행한다.
          1. case 1
            1. notion image
              위 예시와 같이 src와 tgt graph 모두 같은 subgraph가 존재하는 것을 확인했다.이 subgraph를 새로운 input tensor로 표현해서 substitution graph를 간소화시킬 수 있다.
          2. case 2
            1. notion image
              위 예시와 같은 경우 모든 output tensor들이 겹치는 것을 확인할 수 있다. 이 subgraph를 새로운 output tensor로 표현해서 substitution graph를 간소화시킬 수 있다.
        💡
        실제로 이 pruning 과정을 통해서 원본 graph와 비교하여 39배의 간소화가 진행될 수 있었다고 한다.
         

        5. Joint optimizer

        • Joint optimizer는 data layout과 graph optimization을 동시에 진행
        이때 optimizer는 Metaflow에서 사용하는 cost-based backtracking algorithm을 사용한다. 이때 이 알고리즘은 검증된 subgraph들을 활용하여 최적화 그래프를 탐색한다.
        이때 Metaflow에서 제안된 algorithm에 가능한 data layout들의 조합도 전부 고려해서 optimized graph를 탐색한다.
        💡
        Taso에서 Tensor의 data layout 과 operator에서 지원하는 모든 data layout들을 enumerate하여 최적의 target graph를 생성한다.
        notion image
        • 해당 자료를 통해 조금 더 살펴보자.
        위 graph transformation은 Column-major만 지원하던 source graph에 Row-major까지 고려한 transpose 적용 target graph의 효과에 대해서 설명한다. B와 A input tensor는 transpose를 거쳐 Row 혹은 Column major 한 intermediate tensor로 표현될 수 있다. 따라서 조합을 생각해보면 (CC, CR, RC, RR) 이렇게 4개의 경우가 존재한다.
        즉, Taso는 transpose라는 operator를 추가함으로써 data layout의 경우를 CC에서 4가지로 늘려서 더 optimized된 graph를 찾을 수 있다.
         
        notion image
        • Cost-based Backtracking search는 Joint optimizer에서 data layout의 cost와 optimizing substitution을 동시에 고려하는데 사용된다.
        Cost model은 DNN operator들은 선형적으로 cost가 늘어나고, 하드웨어의 종류에 따라 성능이 차이가 난다는 점을 주목한다. 즉, 어느 정도 성능을 예측이 가능하다는 것이다. Taso는 DNN operator의 data layout까지 고려한 cost들을 합쳐서 해당 operator들로 구성된 graph의 expected execution time을 구한다.
        • 알고리즘에 대해서 설명해보겠다.
        optimized graph를 구하기 위해, 모든 graph들은 Priority Queue에 저장된다. 각 graph를 Queue에서 뽑은 후, 해당 그래프에 검증된 substitution들의 data layout cost를 고려하여 equivalent substitution을 진행한다. 이때 주의할 점은 cyclic graph들을 제거해야 한다는 점이다.
        notion image
        💡
        간혹 substitution을 진행한 후, cyclic graph가 생길 수 있기에 이 경우 해당 graph는 priority queue에 넣지 않는다.
        마지막으로 optimized graph를 search algorithm에서 return해주면, search space의 축소를 진행한다. optimized graph의 cost에 alpha hyperparameter를 곱한 만큼의 cost인 graph들을 제외하고 모두 pruning한다. 실험적으로 진행한 결과, alpha는 paper에서 1.05로 지정했다고 한다. 값이 1이 된다면 너무 greedy하게 global optimal한 후보군을 탐색하기에 1.05로 진행했다고 한다.
        notion image
        • 결과적으로 생성된 search space를 바탕으로 optimized graph를 찾는다고 생각

        6. Implementation

        Taso는 현재 github repo에 올라와 있고 issue를 살펴보면 계속해서 사용자들이 있는 것으로 보인다. Taso는 크게 c++ 과 python으로 구현했다. c++는 substitution generator 구현 부, python은 graph verifier 구현 부분을 맡아서 진행했다. 당시 Taso가 나왔을 때, 새로운 Operator에 대한 구현에 필요한 최소한의 개발을 위해 전문가가 짧은 시간만 붙으면 된다고 주장했었다. 하지만, repo를 봤을 때 4년 전을 마지막으로 repo가 업데이트 되지 않은 것을 보아 실질적인 한계에 부딪친 것인 게 아닐까라고 생각 중이다.
        해당 문단에서는 새로운 operator가 있어도 opaque operator라고 간주하고 나머지 substitution을 진행한다고 한다.
        Taso는 Metaflow 위에 구현되었다고 한다. 특히 Metaflow의 cost-based backtracking algorithm을 사용했다고 강조하는데 다음 시간에 Metaflow paper를 리뷰해보면서 알아볼 예정이다.
        Taso는 Framework-agnostic 하기 때문에 Tensorrt와 TVM에서도 사용할 수 있다고 한다.

        7. Evaluation

        Paper에서 주목한 질문 핵심은 3가지다.
        1. Taso가 과연 자동적으로 graph를 optimize하고 graph substitution을 검증하는데 너무 느리진 않는가?
        1. Taso는 Real-world DNN architecure와 미래의 operator들 또한 성능을 개선시킬 수 있는가?
        1. Taso에서 제안된 Joint optimization은 각각 순차적으로 진행하는 것보다 더 효과적인가?
        Taso는 당시 DNN들로 유명한 Bert, ResNet-50, NasNEt-A, NasRNN등을 실험군으로 사용했다.
         
        1. End-to-End Evaluation
          1. 우선 모든 DNN graph들을 가지고 실험했을 때, 모두 10분 내의 시간 안에 End-to-End generation이 완료되었다고 한다.
            TensorFlow, TensorFlow XLA, TensorRT, TVM, MetaFlow, 그리고 TASO를 V100 GPU에서 비교했다. TensorFlow, TensorFlow XLA, TensorRT 는 cuDNN, cuBLAS 기반으로 최적화된 라이브러리를 사용하기에 TVM의 경우 2000 trial 을 통해서 각각의 DNN operator들의 최적의 configuration을 구한다.
            End-To-End Evaluation 결과, Taso는 Resnet-50의 모델에 대한 최적화가 성능이 제일 높았다.TVM과 Tensorrt 성능과 비교했을 때 각각 1.1X에서 1.8X , 1.3X에서 2.8X 까지의 성능 향상이 나타났다.
            notion image
        1. Substitution Case Study
          1. 해당 study는 NaseNet-A와 ResNext-50을 다룬다.
            • NasNet-A의 경우 unconventional한 graph 구조를 갖고 있어서 사람이 직접 optimization을 적용하는데 어려움을 느낀다. Taso에서는 이 아키텍처를 최적화하는데 있어 어떻게 적용되는지 한 번 확인해보자.
                1. 2개의 average pooling과 element wise addition을 depth-wise convolution으로 transformation
                  1. notion image
                    • 위 그림을 이해하기 위해서 아래의 수식을 알아볼 필요가 있다.
                    notion image
                    • 상단에 있는 수식은 average pooling 수식이고 하단에 있는 수식은 depth wise convolution이다.
                    • 하단 수식에 있는 w(c, k_x, k_y)는 상수이기 때문에 figure b에서 1단계의 변환은 수식처럼 변환이 용이하다.
                1. Depth wise convolution과 convolution으로 변환
                notion image
              • substitution을 통해 operator overhead를 줄이는 효과를 보았다고 한다.
            • ResNext-50의 경우 large convolution를 사용하는 것보다 multiple branch를 사용하여 small convolution으로 분리해서 figure a처럼 사용한다고 한다. 하지만 이 경우, kernel launch overhead가 있다는 것이 단점이다. figure b에 소개된 것처럼 cuDNN library 중 tensorrt에서 지원하는 Grouped convolution이 존재하지만, 모든 convolution의 상태를 저장하는 cache가 크다는 단점으로 조금의 성능 저하가 있다. 하지만 이와 다르게 taso에서 자동으로 생성해주는 figure c의 graph 경우 figure b와 비교해서 2.8x의 성능을 보였다고 한다.
              • notion image
        1. Joint optimization of Graph substitution, Data layout
            • joint optimization의 성능을 확인하고자 3개의 baseline을 bert model에 사용하여 그 결과를 paper에서 공유하고 있다.
                1. graph substitution만 진행
                1. data layout optimization만 진행
                1. 순차적으로 2개를 진행
            • 아래 결과를 통해 동시에 optimization을 진행하는 joint optimization의 성능이 제일 좋은 것을 확인할 수 있다.
            notion image
         

        Limitations and Future work.

        Taso에서는 user 단에서 제공하는 operator property들에 의존성이 높다는 것을 한계로 정의했다. 이전 방법론보다는 더 향상된 접근법이지만, 아예 이 의존성을 없얘는 것을 목표로 두고 있는 것 같다. 구현 부분을 바로 검증하는 방법으로 cuDnn kernel 단을 활용하는 방법도 고려 중인 것 같다.
        또한 Scalability 이슈가 존재한다. 현재는 subgraph의 크기를 fixed size로 4만큼 만든다는 한계가 있다. fixed size로 4개까지 밖에 진행하지 못한 이유는 generator가 graph 후보군에 대한 정보를 모두 갖고 있어야하여 메모리가 부족한 이유로 4까지밖에 실험을 못했다고 한다. 이 대안으로 제안한 distributed generator를 개발하면 가능할 것이라고 보고 있다. 실제로 NasNet의 경우 더 큰 subgraph를 제공함으로써 성능이 더 좋아질 것이라는 예상이 논문에서 언급되었다.
        마지막으로 graph-level과 operator-level optimization을 같이 고려하는 joint-optimization을 challenge로 두고 있다. 이 2개를 모두 고려한다면 search space가 늘어나고 하나의 optimization이 다른 optimization search space에 영향을 줄 수 있다는 것이 문제다.
         
         
        참고자료
        1. sysml 블로그
        1. Taso graph optimization is for inference efficiency.
        Share article

        allaboutml