요약

이 논문에서는 AWS에서 general-purpose inference serving system인 MArk를 제안하고 이를 통해 SLO 준수 및 비용 효율성이라는 이중 과제를 해결하는 것을 다룬다. 

 

ML에서 SLO가 필요한 이유?

ML을 학습하는 것은 많은 시간이 필요하고 offline에서 진행이 가능하지만, 실제 제공되는 서비스는 real-time으로 연산이 수행되는 inference 부분이다. 그래서 cost-effective하고 low-latency를 보장하기 위해 SLO를 준수하며 ML 모델에 맞는 provisioning이 필요하다.

 

MArk 설계 특징

(1) MArk는 동적인 request를 배치하고, 이들을 performance-cost ratio를 높이기 위해 기회주의적으로 비싼 하드웨어 accelerator를 사용하여 서비스를 제공한다.

(2) feedback control scaling 또는 동적인 워크로드에 대해 over-provisioning하는 것에 의존하기 보다는 낮은 비용을 지불하고 provisioning latency도 숨기기 위해 predictive autoscaling을 사용한다.

(3) MArk는 stateless nature of inference serving의 특성을 이용해서, 유연하지만 비용이 많이 드는 serverless instance를 활용하여 예측하기 어려운 가끔씩 발생하는 load spikes를 처리한다.(IaaS인 EC2는 확장성이 떨어지고, load spike에 취약함, 그래서 이런 요청에 대해서는 비용은 더 들지만 유연한 serverless instance를 활용해서 해결함, 이 논문에서는 IaaS를 다시 provisioning하고 over-provisioning을 하게 하는 것을 비효율적이라고 다루고 있음)

 

성능 평가

AWS의 SageMaker를 baseline으로 사용하여 MArk의 성능평가를 진행하였다. 그 결과 SLO 요구사항을 준수하며, 심지어 더 좋은 latency 성능을 보여주었고, Spot Instance와 interruption-tolerant mechanism을 통해 burstable instance를 활용한 경우, SageMaker보다 최대 7.8배 비용을 감소시켰다.

 

Critique

비용을 낮추기 위해 Spot Instance를 활용한다는 점은 쉽게 생각할 수 있는 부분이지만, 이때 발생하는 interruption 문제를 고려해서 비용을 낮추면서도 문제가 발생할 수 있는 부분에 대비하고 성능을 높이기까지 했다는 점이 가치있다고 생각한다.

정형 기법

테스팅 기법의 한계

- 모든 경우의 입력에 대해 소프트웨어가 제대로 작동함을 보이는 것이 현실적으로 힘들다

 

테스팅 기법의 대안

- equivalent partition : 입력값의 특성에 따라 여러 그룹으로 나누고, 각 그룹에 속하는 값 중에서 하나를 임의로 골라서 테스트케이스의 입력값으로 사용

- boundary value analysis : equivalent partition에서 그룹의 경계값에 해당하는 값을 이용해서 테스트케이스로 사용하는 기법

 

정형기법

- 테스팅 기법의 근본적인 한계를 극복하기 어렵기 때문에 제안된 새로운 방법론

- 정형명세(Formal Specification)기법과 정형검증(Formal Verification)기법으로 나뉨

- 정형검증의 구체적인 기법으로는 symbolic execution, program proof/verification, model checking, program synthesis 등이 있음

 

Symbolic execution

- 입력을 a와 같은 기호로 나타내고 프로그램의 수행 결과를 symbolic expression을 통해서 나타냄

- 한계 1 : index의 값이 변수로 표시된 경우나 포인터가 사용되면 어려움이 있음

- 한계 2 : 반복문이 몇 번 수행될지 결정할 수 없고, loop invariant를 알기 전에는 symbolic expression으로 표현할 수 없다.

- tools : KLEE, PathFinder, SAGE, CUTE

 

Program verification

- 프로그램 또는 특정 구문에 대해서 {P} C {Q}로 표시함 (P : precondition, Q : postcondion)

- 모든 입력에 대해서 제대로 작동한다는 것을 테스팅할 필요가 없다는 발상의 전환에서 시작된 기법

 

Theorem Prover

- tools : Coq. Isabelle, PVS

- 제약 1 : 사용법을 배우고 실제 현장에서 쓰기 위한 진입장벽이 높다

- 제약 2 : 정리증명기를 사용하는 개인의 능력과 경험에 따라서 증명의 성공과 실패 여부가 달라질 수 있다

- 장점 : 상태폭발(state explosion)의 문제에서 자유롭다

 

Model Checking

- 장점 1 : Theorem Prover과 달리 진입장벽이 낮다

- 장점 2 : 증명과정 전체가 자동화되어 있어서 증명에 성공하면 true를 아니면 반례를 출력해줌

- tools : SMV, SPIN, PathFinder, SLAM

- 제약 1 : 분석해야하는 상태가 급격하게 늘어나 상태폭발 문제로 검사가 불가능한 경우가 발생할 수 있음

 

A Candid Industrial Evaluation of Formal Software Verification using Model Checking - 리뷰

Introduction

Model checking의 장점은 이를 통해 주목할만한 특성들이 true인 것에 대한 확실한 증거를 제공해준다는 점에 있다. 하지만 Model checking은 (1)state explosion, (2)regulatory limitation, (3)lack of relevant skill, (4)inadequate model validation과 같은 한계를 가지고 있다. 이를 극복하기 위해서, 실제 시스템을 테스팅하거나 실제 모델과 실제 시스템을 비교하기 위한 추가적인 분석이 필수적이다.

 

safety-critical software industry의 21명의 엔지니어를 대상으로 다음과 같은 설문 조사를 진행하였다.

(1) Awareness of model checking

(2) Whether model checking should be used

(3) Why they thought that model checking was not used

 

(1), (2)를 통해 엔지니어들이 model checking을 잘 모르지만 좋은 아이디어라고는 생각하고 있음을 확인할 수 있다. 그리고 (3)을 통해 관리자로 부터의 지원 부족과 관련 지식 부족이 방해물이 되고 있음을 확인할 수 있다.

 

이 연구의 목적은 model checking 기법이 ‘standard industrial environment’에서 ‘usefully’하게 성능을 보이게 하는 것이다. 여기서 말하는 ‘usefully’는 더 싸고, 빠르고, conventional testing 또는 review보다 더 철저하고, subtle error를 찾는 것에 대해 더 철저한 것을 의미한다. 그리고 ‘standard industrial environment’는 엔지니어가 바로 액세스할 수 있는 툴을 사용하는 환경, 산업계에서 볼 수 있는 모델, 산업계에서 볼 수 있는 일반적인 오류를 포함하는 환경을 의미한다.

 

Case Study Data

gas tubine aero engine domain의 health monitoring system과 MATLAB과 Simulink로 실행되는 MERVE를 모델로 삼았다. Simulink는 산업계에서 널리 사용되는 툴이고, model checker SDV를 포함하고 있다.

 

Case Study Process

- Investigated Errors

산업계에서 일반적으로 존재하는 문제들의 카테고리를 결정하는 것이 이 차례의 목적이다. 전체 PR의 갯수는 1477개 이고, 우선 아래와 같은 다섯 가지의 타입으로 PR(Problem Reports)을 나눴다.

• PRs that have been cancelled;

• PRs relating to hardware;

• PRs that introduce new features;

• PRs that make general improvements;

• PRs for document-only updates.

possible 카테고리에 있는 모든 PR을 자세히 검사하지 않고, 많은 순서대로 정렬해서 매 열번째 PR을 골랐다. 그렇게 총 49개의 PR이 어떻게 model checking에 의해 탐지될 수 있었는지 자세하게 검사하고 다음과 같이 분류했다.

• Property violation: a specific requirement was violated by the underlying requirements or design;

• Emergent: no requirement was violated, but the actual behaviour did not meet the designer’s intent;

• Consistency: typographical and non-functional errors.

 

- Model Checking

각 오류는 MERVE 모델과 함께 model checker를 사용하여 감지 될 수있는 방법을 결정하기 위해 분석되었다.

MERVE는 70000개가 넘는 블록들과 수백개의 입력값과 출력값을 가지는 큰 모델이다. 이 연구에서는 다음과 같은 이유로 전체 모델에 대해 model check을 하지 않았다.

(1) 현재 도구로 분석하기에는 state space가 너무 클 수 있음

(2) Simulink 기능을 활용하여 작성되었고, SDV에서 모두 지원되는 것이 아님

(3) 이 모델은 SDV를 사용할 수 없는 MATLAB 2007 버전으로 작성되었음. 2010버전으로 실행해야 했으며, 전체가 호환되지 않았음

(4) 테스트할 속성과 관련없는 시스템의 부분들을 제거하면 학습이 더 빨라짐

문제와 관련된 부분을 분리하여 분석하는 방법이 있을 수 있지만, 이는 다른 부분과의 상호 작용이 누락될 수 있으며, 모델의 관련 부분을 제외시킬 위험이 커진다. 실제로 model checker는 전체 모델을 확인하는 수단으로 사용되지 않고 특정 기능을 목표로하고 테스트를 통해 기능을 보강한다.

49개의 PRs을 검사한 결과, 42개는 model checking에 익숙했고, case study에 사용된 모델에서는 9개만 나타났다. 

 

- Top-Down Verification of Requirements

model checking을 사용하면 conventional reviewing보다 약 두배의 시간이 걸린다. 하지만 숙련된 SDV 사용자는 properties를 더 빨리 생성할 수 있고, properties가 생성되면 자동으로 결과 및 보고서를 생성하여 몇초 만에 다시 실행할 수 있다. 그리고 model checking을 이용하면 개발 프로세스 초기에 오류를 찾아서 시간을 절약할 수 있다.

 

- Certification using Model Checking

MERVE와 같이 모델이 자동으로 생성되는 경우, 모델과 실제 시스템 간의 차이가 줄어 보증 프로세스가 간소화된다. 그리고 소프트웨어 디자인이 모델과 일치함을 보이기 위해 수동으로 검토를 할 수도 있다. 

 

Discussion and Observations

- Errors Found

model checking의 전제는 property의 증거를 제공해서 모델의 정확성에 대한 높은 신뢰도를 제공한다는 점이다. 그리고 model checking을 통해 기존의 많은 오류가 발견될 수 있었으며, 이는 개발 주기의 초기에 발견될 수 있다. 하지만 오류가 조기 발견된다는 사실은 알 수 있었으나, 기존 검증보다 더 많은 오류를 발견한다는 증거를 찾을 수 없었다.

 

- Certification

SDV는 독점적인 도구이고, certification은 독점적이므로 SDV가 실제로 자격이 있는지 또는 자격이 있는지 여부를 결정할 수 없다.

 

- Effort

conventional verification에 필요한 노력을 추정하고 이를 SDV를 사용하여 소비한 노력과 비교했다. SDV를 사용하면 빠르게 요구 사항을 처리할 수 있고, 이를 반복적으로 할 수 있다. 그리고 SDV의 이점은 작성된 결과 보고서를 자동으로 생성한다는 점이다.

 

- Simplicity

SDV는 모델링 환경에 직접 통합되고 대부분의 요구 사항은 단순한 'implies' 관계에 매핑되므로 high-level requirements를 공식적으로 모델링된 property로 간단하게 변환 할 수 있다.

 

- Modifications to the Model

경우에 따라 SDV와 호환되도록 원래 모델에서 블록을 제거해야했다. 그리고 수정된 모델에서 입증된 property가 코드가 생성되는 원래 모델에서는 적용되지 않을 수 있기 때문에 문제가 발생한다. 모델을 개발할 때 SDV가 지원하는 블록만 사용하여 이를 피할 수 있다.

 

Validity and Limitations

호환성 문제로 인해 더 다양한 모델을 평가하기 위해 추가적인 작업이 필요하다. 전통적인 방법으로 오류를 발견했었는지 여부가 병확한지 않을 수 있다. 명확하지 않은 model checking은 잠재적인 어려움이 있다.(ex. state exlosion) 실제 model checking을 통해 모든 부분이 모델링되기는 어렵기 때문에 전통적인 검증 기능을 유지할 필요가 있다. 그리고 모델을 얻는 것에서도 어려움이 있을 수 있다. model checking은 안전이 중요한 소프트웨어 표준에 언급되지 않았고, 이를 갖춘 model checker가 없다. 이 연구에서는 하나의 model checker를 사용했지만, 실제로는 여러 model checker를 사용하는 것이 좋다.

 

Conclusions

Moder checking은 다른 전통적인 검증 기법보다 더 많은 에러를 찾을 잠재력을 가지고 있고, 에러를 개발 사이클에서 일찍 발견할 수 있게 해준다. Model checker가 high-level requirement에 맞는 증거와 반례를 찾는데 빠르고 효과적이라는 것을 실험을 통해 보여주었다. 그리고 verification case를 다시 실행하는데 몇초밖에 걸리지 않으므로 수동으로 검토하는 것 보다 훨씬 빠르다. 

이 연구를 통해서 model checking이 유용성을 손상시키는 몇 가지 요수가 있음을 보였다. 모델을 개발하고 검토하는 과정과, model checker와 호환되도록 테스트 중인 모델을 조정하는 것이 수동 테스트 및 검토를 수행하는데 걸리는 시간과 비슷하다. 그리고 SDV는 high-level requirement 모델링 오류, 도구의 제한으로 인해 결론에 도달하지 못하기도 했다. 그래서 기존의 검증이 여전히 필요하다.

이 연구는 산업에서 model checking이 유용하게 적용될 가능성은 있지만, 아직 해결해야하는 미해결 문제가 있음을 보여준다.

(1) 다른 도구의 산업적 사용에 대해서 추가로 조사되어야 한다.

(2) 이 연구에서 제시된 아이디어를 홍보하는 것이 어렵다.

(3) model checking을 통해 감지할 수 있는 문제의 수에 대한 결론을 내리려면 다양한 영역을 다루는 추가 사례 연구가 필요하다.

(4) 전통적인 검증과 model checking을 비교하기 위해 추가 작업이 필요하다.

(5) 특정 경우에 대해서는 SDV로 property를 입증할 수 없다.

(6) assurance argument가 수용가능한지에 대한 추가 작업이 필요하다.

 

공부한 점

사실 model checking이라는 개념이 너무 생소해서 논문을 읽고 이해하는 과정이 많이 힘들었다. 그래서 원리를 이해하기 보다는, 이를 통해 얻을 수 있는 이점과 한계를 위주로 이해하도록 노력했다. 현재 model checking 기법을 사용하면 반복적인 검증에 대해서는 효과를 볼 수 있겠지만, 전통적인 검증 기법과 비교할 때, 처음에 준비단계가 전통적인 검증 기법만큼 오래 걸린다는 점을 고려할 필요가 있다. 그리고 model checking을 통해서 전반적인 시스템을 모델로 검증하기에는 state explosion과 같은 문제 때문에 현실적으로 어렵고, 실제로 model checking은 부분적인 시스템에 대해서 검증할 때 활용되고 있다. 그래서 아직까지는 전통적인 검증 기법이 유효할 수 있으며, 아직 model checking에 대해 더 많은 연구와 개선이 필요함을 느낄 수 있었다.

 

출처

소프트웨어공학 개론, 차성덕

A Candid Industrial Evaluation of Formal Software Verification using Model Checking, Matthew Bennion, Ibrahim Habli

learning-augmented system 잠재력을 펼치기 위해 ML/DL 알고리즘 또는 시스템 기능을 개선하기보다는 learning-and-system co-design 촉진시키는 것이  중요하다고 주장하고 있으며, 이를 위한 공통 프레임워크로 AutoSys 소개함.

 

1. Motivating Case Studies

Web Search 통해 현대 시스템에 적용할 만한 점들을 분석하였음

- Selection Service : keyword matching, esmantic similarity, past populariy 같은 것들을 통해서 검색함

- Ranking Service : 사용자가  좋은 검색 결과를 얻을  있도록 관련된 문서를 예측해서  상단에서 노출될  있게 

- Reranking Service : 이미지와 같은 추가적인 content types 대해 추가하고 랭킹을 매김

 

insight

현대 시스템은 소프트웨어 로직 파라미터, 하드웨어 configuration, actions of an execution sequence, engine selection, hyper-parameters of ML/DL algorithms and model 같이 컨트롤 가능한 시스템 knobs 함수로 추상화할  있음

 

1) Source of System Complexity

- Heterogenous claasses of decision-makings

system operator knobs 제어하는 것은 가능하나, 모든 조합에 대해 효과를 고려하면서 최적의 knobs 구성하는 것은 어려움

- Multi-dimensional system evaluation metrics

metrics 많아지면서 실제 시스템의 성능을 높이는게 어려움

metric들이 다른 목표를 가지게 되면, 각각에 대해 최적화를 진행하여도 서로 상충되는 결과를 일으켜 실제로 효과가 없을 수도 있음

- Interactions between subsystems and componets

Subsystem 개선이 전체 시스템의 개선으로 이어지지 않을  있음

 

2) Source of Operation Complexity

- Environment diversity and system dyanmics

클라우드 컴퓨팅이 많이 활용되면서, 현대 시스템은 마치 데이터 센터에서 클러스터링   처럼 구성됨

그래서 이렇게 분산된 환경과 동적으로 변하는 시스템을 최적화하여 설계하는 것이 challenge

하드웨어의 업그레이드가 빈번하게 일어나는  뿐만이 아니라, 서버의 자원을 공유하기도 . 그래서 subsystem 인스턴트들과 컴포넌트가 다른 resource budget 있을  있음. 그래서 이를 고려해서 이런 점을 고려해서 설계하는 것이 challenge

현대 시스템은 빈번한 소프트웨어 업데이트 사이클 방식을 채택하고 있음. 그래서 구성이 빠르게 바뀜

- Workload diversity and dynamics

Workload 동적으로 변하며, 예측 가능할 수도, 예측 불가능할 수도 있음

서로 다른 subsystem 같은 workload 대해서 다른 행동을 

- Non-trivial system knobs

시스템과 워크로드가 동적으로 변하기 때문에 현대 시스템을 사전 지식만을 바탕으로 튜닝하는 것은 어려움

knobs 사이의 의존성도 고려해야함

 

2. Learning-augmented System Design

1) Principles on Making Systems Learnable

P1 : 학습을 위해 필요한 feature들을 드러내고, generality 위한 시스템 상세를 추상화한  명시된 인터페이스

ML/DL 위해 필요한 정보를 추출하도록 인터페이스가 만들어지지 않았음

configuration files 직접 수정하는 것은 시스템이 제약 조건을 적용할  없고, ML/DL 작동에 대한 피드백을 제공할  없다는 것을 의미함

raw logs 파싱하는 것은 time-consuming

 

So,

-  정의된 control interface 필요함

- control interface 원인과 효과를 잡아내기 위해 시스템 행동의 feature 드러낼  있어야함

- data outlier 제거하여 skew 또는 잘못된 학습 프로세스를 피할  있어야함

 

P2 : 시스템 실패 예방과 탐지를 위한 모니터링 되는 ML/DL acturations

- 정확성을 보장하는 것은 사람이 작성한 로직을 검토하는 과정이었지만, ML/DL 모델로는 정확성이 보장되는지 쉽게 해석하기 어려움

- 완전한 데이터 셋을 구성하기 어려움

So, 현대 시스템은 ML/DL 행동을 모니터링하고 효과를 입증하는 메카니즘이 필요함

 

2) Principles on Making Learning Manageable

P3 : 학습 복잡도를 줄이기 위한 모듈화된 학습

- 거대한 현대 시스템에서 고려할 사항  하나는 learning task 관리하기 쉬운 부분으로 나누는 것임

So, modularized learning 통해서, 모델은 오직 subsystem 또는 component 행동만을 학습함

 

Challenges,

- modularized learning challenge 전체 learning cost 최소화하는 modularization 결정하는 것임

- 다음 모듈이 어떻게 이전 모듈의 output 사용하는지에 대한 지식이 없는 상태로는 global optimum 대해 설명하기 어려움 (데이터 의존성 문제)

 

P4 : system exploration model maintenance 위한 자원 관리

- 현대 시스템이 요구하는 자원은 다음  타입의 작업과 관련이 있음

(1) system exploration benchmarks

(2) ML/DL model training

- learning-augmented system 유지하는 것은 다음과 같은  가지 이유로 많은 양의 위와 같은 작업을 야기한다.

(1) 시스템 규모와 복잡성을 맞춰주기 위해 modularizing learning 거대한 클라우드 시스템을 많은 수의 ML/DL 모델로 나눔

(2) cloud system dynamics 모델 학습이 one-shot process 간주되면 안된다는 것을 의미함. 이전에 훈련된 모델에 대한 가정이 바뀌면 모델을 재학습 시키거나 점진적으로 업데이트 해야함

So,

- learning-augmented system  좋은 모델로 유지하기 위해서는.  작업을 위한 한정된 자원을 관리하기 위한 메커니즘이 필요함

ex) prioritizing system exploration benchmarks based on how they are expected to help the predictive model accuracy, and scheduling jobs of heterogenous requirements for the resource pool

 

3. AutoSys Framework

1) Training Plane

- P3, P4 맞는 model training requirements 다룸

- 존재하는 모델이 재설계되어야 하는지 또는 Inference Plane 피드백에 따라 업데이트 되어야하는지를 결정함

- Candidate Generator : 반복적적으로 training inputs 생성하여 low inference accuracy 또는 high inference uncertainty learning region 넣음

- Trial Manager : 각각의 candidate Trial instance 추상화함. decision-making scenarios 지원하기 위해 이질적인 자원 요구 사항을 부과할  있음

- Model Trainer : inference accuracy, inference cost, training cost 고려해서 모델 아키텍처가 설계되어야 

 

2) Inference Plane

- P2, P4 맞는 decision-making requirements 다룸

- Inference Runtime : modularized modules 통해 시스템이 모델들의 셋으로 표현됨. Inference Plane 독립적인 시스템 모듈을 위해 final output separate actuations으로 바꿀  있음

- Rule Engine : potential learning-induced failure 대비하기 위해, AutoSys ML/DL decision algorithms 결정록적인 rule-checking engine으로 감싸고 있음. 이는 실제 사람이 읽을  있는 룰을 가짐.  통해 basic sanity, knob dependencies 체크하고, 예측 값과 실제 값의 차이를 체크함

 

3) Target System

- target system control interface 통해 감싸져있음

- system monitor 로그를 분석해서 잠재적인 health problem 탐지함

 

critique

AutoSys 실제로 사용하는 내용이 포함되어 있지 않아, 실제로 각각의 Plane에서 이뤄지는 작업 내용을 파악하기 힘들었음. 각각에 대해 무엇을 해야한다와 같은 내용은 서술되어 있지만, 실제로 어떤 작업을 파악하기 힘들게 작성이 되어있어서 아쉬움. 그리고 Web Search 베이스로 얻은 insight만을 활용해서 서술되어 있어 다른 시도도 같이 해봤으면 좋았을  같다는 생각이 들었음

1. Introduction

- 딥러닝 연산의 성능은 RDMA 같은 cross-machine 통신의 효율에 의존하고 있음

- RPC general-purpose communication paradigm으로 널리 사용됨

- RDMA에서 RPC 같은 데이터를 동시적으로 write하는 것을 가능함

- TensorFLow 같은 딥러닝 프레임워크에서 gRPC communication abstraction으로 사용하고 있음

-  논문에서는 RDMA-capable network에서 분산 딥러닝 연산을 위한 RPC 사용하는 것에 대해 논의함

(i) 딥러닝 연산은 tensor main data type으로 사용함. 하지만 RPC 이용해 tensor data 전송하는 것은 충분한 효율을 제공하지는 않음

(ii) RPC memory copy 포함함

- 그래서 data access관점에서 remote machine 만듬

- zero-copy cross-machine tensor transfer mechanism 디자인함

- 제안된 기술을 통해 최대 169% 성능 향상을 얻어냄

 

2. Background and Problems

2.1 Deep Learning Data-Flow Graph

- 딥러닝의 연산 과정은 data-flow graph 표현할  있음

- node layer에서의 computation 나타내고, edge dependent node 사이에서의 data flowing 나타냄

- Data-Flow Graph 지원하는 framework 사용하면, 개발자들은 복잡할  있는 다양한 형태의 뉴럴 네트워크를 편리하게 실행시킬  있음

- 분산 딥러닝에서는 mutiple server에서 data-parallel 또는 model-parallel하게 실행시키기 위해 data-flow graph replicating, partitioning

- 딥러닝 프레임워크에서 data-flow graph 생성되고 연산이 시작되기 전에, graph 분석하고 최적화하는 것이 의미가 있음

- graph analysis phase에서, static graph-analysis phase 높은 계층에서 유용한 정보를 추출하여 전송함으로써, 낮은 계층의 runtime efficiency 향상시킬  있음

 

2.2 Remote Procedure Call(RPC)

- RPC 서버들 사이에서의 common abstraction for communication

- RPC 통해 다른 서버의 프로시저를 마치 local에서 수행시키는 것처럼 실행시킬  있음

- RPC 통합된 직렬화와 역직렬화 기능을 가진 structured messages 전송하는데 사용됨

- RPC abstraction 임의의 유형의 메시지를 언제든지 전송할  있도록 설계되었음

 

분산 딥러닝에서 RPC 가지는 한계

- 하지만 major data abstraction tensor meta-data 오직 shape element type 정보만을 가지기 때문에 이러한 유연성은 딥러닝에서  이득을 주지 않음

- 오히려 communication library 수신된 메시지를 어느 사용자 버퍼에 직접 전달해야하는지 미리 알기 어렵게 

- 그래서 보통 운영체제 계층에서 메시지를 받기 위해 fixed in-library 버퍼를 사용하고,  후에 적절한 사용자 버퍼로 복사함

- in-library 버퍼는 각각의 채널과 연관되고, 크기의 제한이 있어야 . 그렇지 않으면 클러스터 서버의 규모가 커지면 memory consumption 확장성 이슈가 발생함

- sender receiver 버퍼보다   메시지를 전송하고 싶을 , 메시지는 여러 fragment들로 나눠지고, 각각의 fragment에는 header information 추가되어야 . 그래서 sender에서 추가적인 data copy 발생하고, 메시지의 크기에 비례해서 data-copy overhead 발생함

- communication 계층에서 abstraction 다시 설계하지 않으면 이러한 overhead 제거할  없음

 

정리 : RPC 분산 딥러닝에서 사용하면, 메시지 크기에 비례해서 data-copy overhead 발생하기 때문에 communication 계층에서 abstraction 다시 설계할 필요가 있음

 

2.3 Remote Direct Memory Access

- RDMA 하나의 서버에서 다른 endpoint 운영체제를 거치지 않고 원격 서버의 메모리에 직접 연결하는 것을 허용하는 emerging fast network technology

memory verbs : one-sided RDMA reads, writes, and atomic operation, remote CPU 없이 작동하도록 memory address 지정함. remote side에서 CPU 오버헤드를 제거한다는 점이 memory verbs 장점임

messaging verbs : remote side CPU 포함되는 send, receive verbs 포함함, verbs application 통해 RDMA NIC 있는 queue들로 전송됨.

queue pair(QP) : 큐는 send 큐와 receive 큐가 항상 같이 존재함, 각각의 큐는 관련된 CQ 가짐

completion queue(CQ) : RDMA NIC verb 실행 완료시 채움

- unreliable, unconnected 설정할 수도 있지만  논문에서는 reliable connected RDMA transport 사용함

-  논문에서는 RDMA에서의 high-bandwidth kerner-bypassing으로 인해 발생하는 extra message-data copy 제거함으로써, 통신 효율을 증가시킬  있다는 점을 주목함

- The one-sided memory read/write semantic of RDMA 원격 주소를 이미 알고 있기 때문에 서버간의 통신에서 zero-copy 얻어낼  있음

- tensor 딥러닝 연산 중에 서버 사이에서 주고 받는 주요한 data type이기 때문에, simple memory-copy interface 추출하는 것이 좋다고 생각하고 있음 (why?)

 

정리 : RDMA에서 발생하는 extra message-data copy 제거하여 통신의 효율을 높일  있음

 

3. Design

3.1 RDMA Device Abstraction

- communication library 각각의 RDMA NIC RDMA device 추상화함

- device 다른 device 통해 원격으로 memory region allocate/free 하기위한 인터페이스를 제공함

- endpoint로서의 원격 device IP 주소와 port 같은 명세를 통해, 사용자는 원격 device local device 연결하는 local device object 부터 채널을 얻을  있음

- channel RDMA QP cross-server 데이터 전송을 위해 제공되는 memory copy interface(local/remote region, transfer direction argument 가짐) 매칭시킴

- 실제 data transfer one-sided RDMA read/write verbs 통해 작동함

- memory copy interface 사용하기 위해서, 접속될 원격 메모리의 region 주소를 알아야 

- library remote memory address 분산시키기 위한 목적으로 RDMA send/recv verbs 사용해서 간단한 vanilla RPC 메카니즘을 제공함

- RDMA device device CQ 수와 연결된  peer remote device 대한 QP 수로 구성됨

- library RDMA 이벤트 완료를 위한 CQ polling하는 thread 함께 thread pool 운영함

- remote peer device 대한 연결이 형성되면, round-robin fashion으로 처리하는 CQ 함께 생성된 QP 관련 있는 association 알림을 전달

- interface 얻은 채널은 사용자가 채널이 사용하는 specific QP 특정하는 것을 허용함.

- 인터페이스를 통해 multi-threaded workload 병렬화와 통신 효율을 위한 로드 밸런싱과, QP CQ에서 발생하는 동기화 cost 대한 밸런싱을   있음

 

3.2 Transfer with Static Placement

- graph analysis phase 중에는 tensor shape 고정적으로 결정이되고, 전체 연산 중에 바뀌지 않음

- 그래서 analysis engine 사전에 tensor 위한 memory region 할당하고, 연산 중에 tensor 배치를 고정해둘  있음

- tensor transfer sender 연산 중에 receiver 직접 content of the downstream tensor 작성하기 위해 memory copy interface 사용할  있음

- tensor memory region 끝에 있는 flag byte 얻기 위해 receiver content of the downstream tensor 모두 작성되었는지 알아야함

- RDMA NICs 주소에 대해 오름차순을 따라 작성하기 때문에 flag byte 전달 받으면, 전체 tensor content 전부 작성되었음을 의미함(flag byte last byte 전송됨)

- receiver 주기적으로 flag byte poll

- tensor transfer 완료되면, receiver 나중에 사용하기 위해 flag 비워두고, 실행을 위해 전송받은 tensor 의존하는 graph node 활성화 

 

3.3 Transfer with Dynamic Allocation

- tensor placement 항상 고정적으로 결정되는 것은 아님

- 각각의 mini-batch iteration training data 따라 서버 간의 전송되는 tensor shape 다를  있음

- tensor shape 바뀌더라도, tensor 차원은 연산 중에 바뀌지 않음. 고정된 tensor-dimension 수는 tensor meta-data 크기가 변하지 않음을 의미함

- meta-data에는 dimension , 각각의 dimension 크기, tensor 데이터 타입, sender에서의 remote address of the tensor 담겨 있음

- 연산 중에, sender tensor 사용될 준비가 되면 memory copy interface 통해 sender receiver meta-data 작성함

- receiver meta-data 끝에 있는 flag byte polling
- meta-data 작성이 완료되면, flag byte 비우고, RDMA 사용가능한 memory region 새로 들어올 tensor 위해 할당함

- static placement 비교하면, dynamic allocation tensor allocation meta-data 직렬화와 전송으로 인해 추가적인 오버헤드를 발생시킴

 

3.4 RDMA-Aware Graph Analysis

Preallocate data buffers

- TensorFlow 같은 딥러닝 프레임워크를 통해 명시적으로 지정된 shape 프로그램에서 직접 static shape 가진 initial set of input tensor 식별함

- 그래프 노드의 shape-inference 함수를 사용하여 정적 속성을 가진 set of output tensors 정적 입력 속성  입력 텐서의 shape 재귀적으로 추론함

-   과정을 통해 static shape 가진 모든 tensor 식별됨

 

- 그래프가 다른 서버들로 분할 되고,  서버에서 하위 그래프가 실행되기 전에, receiver-side tensor 데이터 버퍼 또는 메타 데이터 버퍼는 사전에 할당 

- 그리고 버퍼에 원격으로 접근 가능한 주소는 (receiver )버퍼가 의존하는 upstream tensor 가진 서버로 전달 

 

- sender에서 RDMA 통해 전송  메모리 버퍼는 RDMA NIC 미리 등록해서 엑세스   있어야함.  과정은 OS 커널의 non-pageable으로 버퍼를 pining하는 것과 같은 동작을 포함해서 추가적인 오버헤드를 발생시킴.

- RDMA 하드웨어에 따라 등록이 허용되는 버퍼의 수가 제한되기 때문에,  tensor에서 데이터 버퍼를 등록하면 상당한 오버헤드가 발생하고 하드웨어의 리소스 제한으로 인해 예상 못한 오류가 발생할  있음

- RDMA-accessible memory 관리하는 적절한 방법은 미리 충분히  메모리 버퍼를 RDMA NIC 등록해두는 것임. 미리 할당되는 memory 크기는  논문에서 구현한 graph analyzer 결정함(memory allocator preallocated memory 관리하는데 사용됨)

 

Decide tensor allocation site

- 보통 RDMA 통과하는 tensor sender 추가적인 RDMA-accessible 버퍼를 할당하고, original buffer에서 해당 버퍼로 복사하는 작업이 필요함. 이러한 메모리 복사를 피하기 위해, graph analyzer 전송될 tensor 위해서 RDMA-accessible 버퍼를 직접적으로 할당하는 것을 선호함. 하지만 언제 특정한 tensor 할당되는지를 찾는 것이 어려움.

- 실제 graph node input tensor 저장은 direct predecessor node에서 실행할  할당이 이뤄지지 않을 수도 있음. 왜냐하면, 몇몇의 graph node들은 자신의 input tensor에서의 내부 조작을 수행할  있고, tensor 버퍼가 그래프의 여러 노드를 지날  있기 때문임. 그래서  논문에서 dynamic analysis method 제안함

- 전송될 tensor 스토리지의 allocation site 확보하기 위해 graph analyzer 그래프 실행 runtime 사용된 tensor allocator 계측함

- 첫번째 mini-batch iteration 위한 그래프가 실행되는 동안,  tensor allocation 대해 tensor data 버퍼 주소와  tensor 버퍼 주소를 키로 하여 tensor 데이터 버퍼 주소와 할당을 호출하는 해당 그래프 노드의 정보를 기록함

- 그래프 노드의 정보는 그래프 노드의 식별자, 해당 노드의 할당 id 포함함. 만약 map 같은 주소가 이미 존재하면, 새로운 정보가 오래된 정보를 덮어씀(같은 tensor 주소에 대해서 최신 정보를 유지하기 위해)

- graph node 실행 중에 tensor 전송하면, 런타임은 tensor 버퍼 주소를 가져오고, tensor 버퍼를 할당하는 그래프 노드의 정보를 얻기 위해 map에서 찾음. 그런 다음에 tensor 할당 그래프 노드의 정보를 RDMA-accessible region 직접 할당해야하는 메모리 region 세트 S 저장함. 후속 mini-batch 그래프가 실행되는 동안,  tensor 할당에 대해, 런타임은 실행 중인 그래프 노드가 세트 S 존재하는지 검사함. 만약 존재한다면, RDMA-accessible memory region 관리하는 allocator tensor 버퍼를 할당하고, 아닌 경우에는 normal allocator tensor 버퍼를 할당함. (why?)

 

3.5 GPUDirect RDMA

- GPUDirect RDMA RDMA NIC host memory 사용하지 않고 GPU memory 직접 접근할  있도록 해주는 기술임. 이를 통해 GPU memory copy 하는 비용을 아낄  있음

- 사용자 수준에서 CUDA API 통해 매핑된 고정 모드에서 GPU 메모리 공간을 할당하고 RDMA NIC 등록만 하면  ( 논문에서의 디자인 원리와 방법론을 통해 GPUDirect RDMA 쉽게 적용할  있음)

- GPU 메모리 값을 효율적으로 폴링하는 것은 어려움. (모든 주소에 대해 폴링을 하기 위해 커널 기능을 사용하면 GPU 리소스를 낭비하게 ) 그래서 3.3에서 설명한 동적 할당 메커니즘을 항상 사용함 (tensor 메타 데이터는 호스트 메모리 저장하여 CPU에서만 폴링이 일어나게 하고, 실제 tensor 데이터는 GPU 메모리에 저장하여 one-sided RDMA read 통해 전송될  있음)

 

4. Implementation

사용한 프레임워크 : TensorFlow

- 3에서 묘사했던 tensor 데이터를 RDMA 통해 전송하기 위한 메커니즘을 실행시키기 위해, two pairs of custom operators 개발했고, 확장된 스케줄링 메커니즘을 소개하겠음.

- static placement 통한 tensor 전송에서는 RdmaSend RdmaRecv operator들을 사용함

- graph analysis phase 동안, 전송받은 tensor RDMA-accessibility 함께 미리 할당되고, RdmaRecv 속성으로 세팅됨.  tensor 전체 연산이 끝날  까지 해제되지 않고, address 변하지 않음. 그리고 해당 tensor remote-accessible address 해당 RdmaSend operator 보유한 서버로 전달되어 해당 operator 속성으로 설정됨.

- RdmaSend 실행되도록 예약되면, one-sided RDMA write 통해 전송받은 tensor 내용을 직접 업데이트함.

- RdmaRecv에서 전송 받은 tensor 사용했음을 RdmaSend 알리는 메커니즘이 필요하지 않음. (그래프의 loop 또는 multiple mini-batch iteration 순차적인 실행의 의존성으로 인해 전송 받은 tensor 사용  다음에 예정된 RdmaSend 실행이 자연스럽게 보장되기 때문임)

- 3.3 Dynamic allocation 위해 RdmaSendDyn RdmaRecvDyn 구현함

 

- RdmaRecv, RdmaRecvDyn에서 flag byte 폴링해야하는데, 이를 실행시키면 너무 많은 자원을 낭비하고, 너무  지연시간이 발생함. 그래서 polling-async라는 새로운 실행 모드를 소개함

- polling pahse에서, 스케줄러가 폴링이 성공했는지 체크를 . 만약 아니라면, 해당 operator ready queue 끝에 다시 넣음. 다른 방법으로는, 해당 operator 비동기적 실행 모드로 바꾸고 다시 스케줄링하는 방법이 있음.

- 이를 통해, 실행해야하는 다른 준비된 operator 있을 때의 polling 오버헤드를 줄였음

 

5. Evaluation

cluster : 8 servers

CPU : dual 2.6 GHz Intel Xeon E5-2690v4 14-core CPU

Memory : 512GB

GPU : 2 NVIDIA Tesla P100 GPU

Interconnection : 100Gbps InfiniBand (Mellanox MT27700)

OS : Ubuntu 16.04

installed : CUDA 8.0, cuDNN 6

 

- 마지막 실험을 제외하고는 GPUDirect없이 평가됨

- TensorFlow (버전 r1.0 이후) gRPC abstraction으로 RDMA 통신 계층을 래핑하는 방식으로 RDMA 지원하므로, private message buffer 유지하고, 추가적인 memory copy 필요함

- device  4개의 CQ  연결에 대해서는 4개의 QP 경험적으로 설정함

 

딥러닝 벤치마크

- AlexNet, Inception-v3, VGGNet-16, LSTM, GRU, FCN-5

 

Model size : 모든 가변 tensor 크기  ( 미니 배치에서 parameter server worker 사이의 통신량)

Computation time : 단일 서버에서 하나의 샘플 데이터를 처리하는데 걸리는 평균 실행 시간


- Inception-v3 모델은 계산 집약적인 워크로드임

- VGGNet-16  worker 1GB 이상의 모델과 gradient data 각각의 미니 배치로 전송해야해서 네트워크 병목현상 발생이 많이 발생함

 

- 가변 tensor 50% 이상이 10KB보다 크고, 20% 이상이 1MB보다 훨씬 .  용량에서는 1MB보다  tensor 전체 tensor 용량 중에서 96% 차지함.

 

- 대부분의 실험은 랜덤으로 생성되고, 수행 시간을 평가하는데 사용되는 종합적인 데이터 셋을 사용해서 수행됨

- 현실 시나리오에서 저자가 만들 기술의 효과를 보여주기 위해서, real-world datasets 사용하는 3개의 end-to-end 어플리케이션의 convergence 측정함

- Seq2Seq, WTM’10 French-English machine translation corpus (20 GB text data)

- CIFAR, CIFAR-10 모델, 60,000개의 32*32 colour images in classes

- RNN, SE(sentence embedding task), private 3.7 GB text data

 

- 실제 throughput (mini-batches/second) 관련한 모든 성능 수치는 100개의 mini-batch iteration 5번씩 실행하고 평균을 취해서 사용함

 

5.1 Performance on Micro-benchmark

- FDMA.zerocp gRPC.TCP보다 tensor size 따라 1.7배에서 61배까지 성능이 향상됨

- gRPC.RDMA에서는 여전히 데이터 직렬화/역직렬화와 sender receiver memory RDMA 버퍼 사이에서의 data copy 발생함. 하지만 RDMA.zerocp에서는 이러한 오버헤드를 피하기 때문에 tensor size 따라 1.3배에서 14배까지 성능 향상을 보임

- 메모리 copy 대한 오버헤드를 평가하기 위해, graph analysis optimization 꺼서 sender tensor 미리 RDMA-accessible 영역에 미리 할당되지 못하게 (RDMA.cp).  결과, RDMA.zerocp RDMA.cp보다 tensor size 따라 1.2배에서 1.8 성능향상이 있음을 보임

 

5.2 Performance on Deep Learning Benchmarks

Performance

- VGGNet-16에서, RDMA gRPC.RDMA 보다 117%에서 145%가량 성능 향상을 보였음

- AlexNet, VGGNet-16, FCN-5 RDMA 통해 많은 성능 향상을 보였는데, 이는 통신에 의한 병목현상이 크게 작용했었기 때문임

- mini-batch size 따라 수행시간이 크게 변하지 않는데, 이는 전송되는 데이터 사이즈는 mini-batch size 관련이 없고, GPU 인해 mini-batch 빠르게 처리하기 때문임. 하지만 Inception-3, LSTM, GRU에서는 mini-batch size 32보다 크면 local computation time 같이 증가하고, local computation time 비중이 커짐

Convergence

- perplexity : 언어 모델을 평가하기 위한 지표, 낮을수록 성능이 좋음을 의미함

- SE 모델에서 gRPC.RDMA 결과를 모으는데 실패함. TensorFlow gRPC.RDMA 사용하면 충돌을 일으켰음

Scalability

- mini-batch size 32 통일함

- LSTM, Inception-v3에서는 좋은 scalability 보여줌

- VGGNet-16 communication intensive application이어서 확장성이 network efficacy 의해 결정됨

- 3경우 모두, RDMA 서버를 2개만 사용해도 local implementation보다 좋은 성능을 보임

Memory Copy Overhead

- graph analysis 끄고 zero copy 위한 최적화를 스킵하고 비교 분석함

- Inception-v3, GRU computation intensive하기 때문에 네트워크와 관련한 최적화로는 이득을 조금밖에 얻지 못함

- zero copy larger tensor size 영향을 받음. 하지만 Inception-v3 많은 작은 tensor 가짐(196 variable, 하지만 모델 사이즈는 92.9MB 밖에 안됨)

GPUDirect Support

- GPUDirect 사용함으로써, 최대 54% 성능 향상을 보이고,  application 대한 성능 상승의 정도는 이전 실험들과 비슷한 경향을 보임

 

6. Related Work

- Systems leveraging RDMA

- Distributed machine learning systems

 

7. Conclusion

- 새로운 딥러닝 워크로드와 RDMA 같은 네트워크 기술로 인해 네트워크 통신에서 널리 사용되는 RPC abstraction 대해 다시 생각해볼 필요가 있었음. abstraction application 수준 정보를 최적화를 위해 network 계층으로 전달하여 불필요한 추가적인 memory copy 유발하고, 상당한 성능 패널티를 유발

- 그래서 정적 분석과 동적 추적을 포함하는 인터페이스와 같은 간단한 device 설계함으로써, RDMA 기능을 최대한 활용하기 위하여 general deep neural network training 위한 cross-stack optimization 가능하게 하여 default RPC library 대한 대표적인 딥러닝 벤치마크와 비교하여 수배 속도가 빨라지게 했고, RDMA 최적화된 RPC 구현에서 169% 성능 향상을 

Introduction

유닛 테스팅은 object oriented programming에서 많이 사용된다. 하지만 unit test 작성하는 것은 번거롭고, 좋은 unit test 만드는 것은 과학이라기 보다는 아트에 가깝다.

그래서 unit testing 하는 개발자를 돕기 위해, 연구자들은 자동화된 unit test 생성을 위해 다양한 접근을 시도했다. 그리고 이를 통해 많은 양의 코드를 커버하는 효과적인 automated unit test generation tool들이 개발되었다.

 논문에서는 357개의 실제 데이터를 포함하는 Defects4J 데이터 셋을 사용하여 JAVA 위한 오픈 소스 automatic unit test 툴인 RANDOOP, EVOSUITE, AGITARONE 평가한다.

 

How do automated unit test generators perform at finding faults?

- 실험에 따르면 automated test generation tools 결함의 절반 이상을 찾을  있지만, 특정 소프트웨어 프로젝트에서는 결함 찾기에 대한 확신을 얻을  없었다고 한다.

 

How do automated unit test generators need to be improved to find more faults?

- automatically generated unit test에서 오류를 감지하지 못해 코드 커버리지는  문제로 남아있다.

- 모든 결함의 16.2% 발견되지 않은 결함의 36.7% 테스트로 인해 실행된 적이 없다.

- 발견되지 않은 결함 중의 63.3% automatically generated test 적어도  번은 다루었지만 이를 탐지하지는 못했다.

- 15.2% 환경  가타 종속성으로 인해 일시적으로 통과 또는 실패했음.

 

 논문은 다음과 같은  가지의 공헌을 했다고 말하고 있다.

 

1) 357개의 결함이 있는 Defects4J 데이터 셋과 JAVA 위한 3개의 최신 automated unit test generator 이용해서 실험을 진행함

2) 데이터 셋의 결함을 감지하는데 사용되는 생성된 suites 자세히 분석함

3) 연구를 통해, test generator 어떻게 개선시킬  있을지에 대해 insight 제시함

 

Automated Unit Test Generation Tools

- RANDOOP : instances of random unit test generation tool

- EVOSUITE : instances of search-based unit test generation tool

- AGITARONE : commercial unit test generation tool

 

Experiment Procedure

1) Test Generation

- RANDOOP, EVOSUITE : 10 test suites for each fault

- AGITARONE : 1 test suite for each fault

 

2) Flaky Tests

- Tools 비정상적인 테스트를 생성할  있으며, 이를 제거 하기 위해 모든 non-compiling test classes 제거함

 

3) False Positives

- 테스트가 정상이어도 결함과 상관 없는 이유로 실패할  있음

=> False Positive 발생

 

4) Fault Detection

- RANDOOP, EVOSUITE Defects4J JUnit test runner 사용함

- AGITARONE 독자적인 JUnit test runner 사용함

 

5) Coverage Analysis

- Bug coverage 측정하여 1) fully covered 2) partially covered 3) not covered인지 판단

- RANDOOP, EVOSUITE : Cobertura 이용해 code coverage 측정

- AGITARONE : 자체적으로 생성한 coverage files 사용함

 

Do automated unit test generation tools find real bugs?

How many usable tsets are generated?

- RANDOOP 모든 프로젝트에 대해 가장 많은 수의 test 생성했음.

- EVOSUITE, AGITARONE 선택된 class 대해 테스트를 생성하기 때문에  적은 수의 test 생성함

- AGITARONE 시간당 최대 3.3% 가장 적은 비율의 flaky test 생성함(하지만 시간을 많이 사용하기 때문에 당연한 일임)

- EVOSUITE, RANDOOP 평균적으로 각각 3.4%, 8.3% non-compilable test suites 생성함

- RANDOOP test 평균적으로 21% flaky했고, AGITARONE failing test 46% false positive였음

 

How many bugs are found?

- 생성된 test suites 통해 357개의 버그 중에 199개를 찾았음 ( 55.7%)

- EVOSUITE : 145

- AGITARONE : 130

- RANDOOP : 93

- 하나의 툴로 40.6% 이상의 버그를 찾지는 못했음.

 

How are the bugs found?

- with test assertion(146) with exception(109)보다  많은버그가 탐지되었음

- assertion 필요한 버그의 탐지 비율은  낮음(37.34% vs 49.4%)

 

Are bugs that are covered usually found?

- 결함을 드러내지 않은 모든 test suite 중에서 46.8 % 결함을 완전히 커버하지 않았으며 26.6 % 부분적으로 커버하지도 않았음

 

How can the tools be improved? 

A. Improving Coverage

1) Creation of Complex Objects

- Seeding objects observed at runtime

- object 생성을 안내하기 위해 object 대한 공통된 사용 패턴을 마이닝

- Carving of complex object states from system tests.

- 하지만 example information 부재로 인해 문제가 해결되지 않음

 

2) String Optimization

- 검색 알고리즘 통한 문자열 생성

- 정규식을 이용

- input grammar 안다면, test data  효과적으로 생성할  있음

- state-of-the-art tool 여전히 string optimization 필요로 

 

3) Complex Condition

- a randomly initialized character array (char) is unlikely to satisfy the outer condition

- search-based tools like EVOSUITE suffer from boolean flags, which provide no guidance to the search

 

4) Private Methods/Fields

- tool 통해 감지되지 않은 결함 중에 많은 결함이 private methods 존재함

- 일반적으로 테스트 중인 class public interface 사용해서 테스트함

 

B. Improving Propagation and Detection

1) Propagation

- fully covered이지만 never detected faults 있음

- 오버플로우를 탐지하기 위해서는 오버플로우를 유발하는 값으로 실행되어야 

 

2) Assertion Generation

- exception으로  많은 결함을 찾을  있지만, assertion 필요하고, 적절한 assertion 찾는 것이 challenge

 

C. Flaky Tests

1) Environment Dependencies

- Flaky test 종종 시스템의 현재 time/date 같은 Environmental dependencies 원인이 

- EVOSUITE mocked time 제공함

- RANDOOP mocking 사용하지 않음

- AGITARONE mocking 지원하지만, fault 탐지하지 못함

 

2) Static State

- 시스템의 static state 대한 local dependency flaky test 원인이 

- EVOSUITE static variable 찾아서 test 실행하기 전에 리셋함

 

D. False Positives

1) Accessing Private Fields/Methods

- coverage 최대화하기 위해, AGITARONE test private API 접근하기 위해 Java reflection 사용함

 

2) Aggressive Mocking

- AGITARONE 생성한 모든 test suite 31% aggressive mocking 사용하는 것을 통해 발생하는 false positive으로 고통받고 있음

 

Conclusions

1) test generation tools 55.7% fault 탐지했지만 40.6% fault 어떤 tool로도 탐지되지 않았음

2) 16.2% fault 생성된 test 실행되지 않았고, fault 탐지하지 않은 test suite 26.6% fault 부분적으로 커버하지도 않았음

3) 발견되지 않은 결함의 63.3% 최소 한번 이상 automatically generated test 의해 커버되었다는 점을 통해 code coverage 문제점을 시사함

 

리뷰

automatically generated test tool 이용해서 fault 탐지하는 것이 어려운 일이라는 것을  논문을 통해서 확인할  있었다. 그리고 아직까지는 하나의 툴만 이용하는 것이 아니라 다양한 툴을 통해 테스트 하는 것이  좋을  같고, tool 성능을 향상시키기 위해  많은 노력이 필요해보임을 느꼈다. 그리고 test 자동으로 만드는 것의 한계를 느껴, test 기반으로 코드를 작성하는 TDD 같은 기법을 사용해서 결함이 없도록 코드를 작성해가는 방향이 지금으로써는 최선이 아닐까 하는 생각도 들었다. 하지만, 프로젝트의 규모가 커질 수록 test 관리하는 것이 어려워질 것이고 이를 보조하기 위한 automatically generated test tool 필요성은 계속 남아있을  같다.

<Code Review at Microsoft>

Microsoft 개발자들은 코드 리뷰의 가치와 중요성을 인정하고 있고, 다음과 같은 life cycle을 공유하고 있다.

 

1. 리뷰할 코드를 준비한다.

2. 리뷰어를 선정한다.

3. 선정된 리뷰어와 stakeholder들에게 알림이 전달된다.

4. 리뷰어와 stakeholder들에게 피드백이 제공된다.

5. 추가 작업에 대해 소통이 반복된다.

6. 코드 변경이 체크인된다.

 

대부분의 Microsoft engineer은 CodeFlow를 사용한다. 하지만 face-to-face 토론, whiteboard 세션, videoconference와 같은 다른 채널을 통한 코드 리뷰가 논쟁의 여지가 있거나, 빠른 답변을 위해 사용된다. 그리고 사소한 코드 변화에 대해서는 체크인을 하지 않는 팀도 종종 있다.

Microsoft engineer는 코드 리뷰를 통해 코드의 성능을 높이기, 결함 찾기, 지식을 전달, 다른 솔루션 찾기, 개발 프로세스 향상, breaking build 피하기, 팀의 awareness 향상, 코드에 대한 ownership 공유, 팀을 평가하기 등을 얻고자 한다.

 

<Code-Reviewing Challenges>

For Authors

- 리뷰어들에게 리뷰를 요청해도 답변이 없어 결국 직접 방문해서 물어보는 경우가 있다.

- 리뷰어들이 큰 이슈 보다는 너무 사소한 문제에 집중하는 경우가 있다.

- 적절한 리뷰어를 찾는 것이 힘들다.

- 리뷰 요청을 위한 준비를 할 때, 어떻게 작성을 해야하는지 잘 모르겠다.

- rejection을 받을 때, 이유를 받으면 좋겠다.

- 여러 커뮤니케이션 채널을 관리하는 것이 어렵다.

- 툴을 사용하는 것이 오히려 코딩 속도를 느리게 만든다.

 

For Reviewers

- 코드의 목적, 변화를 주게된 동기, 변화된 부분이 어떻게 실행되는지 등을 파악하는 것이 어렵다. 그래서 이를 해결하기 위한 Authors의 자세한 문서 작업을 필요로 한다.

- history of comment를 이해하는 것도 하나의 이슈이다.

- 평가하는데 있어 어떻게 하는 것이 좋은 영향을 줄지에 대한 통찰력이 부족하다.

 

<Best Practices>

For Authors

code change for review 준비 단계

- 리뷰 요청을 준비하면서, 변경점에 대해서 자세하게 체크한다.

- 이해하기 쉽도록 작은 변경점을 다루도록 한다.

- 관련된 변경점을 clustering한다.

- change에 대해 자세하게 묘사하고, motivation을 첨부한다.

- 리뷰를 요청하기 전에 change에 대한 테스트 또는 분석을 한다.

- 리뷰가 정말 필요한 change인지 체크한다.

 

리뷰어를 선정하는 단계

- 얼마나 많은 리뷰어가 필요한지 결정

- 알맞은 경험 또는 해당 코드에 대한 기초가 있는 리뷰어를 선택한다.

- 가능하다면 리뷰어들의 self-select를 허용한다

- 리뷰어 외 다른 사람에게 알릴 사람이 누구인지 체크하고, 사람들에게 spam하지 말 것

- 리뷰어들에게 가능한 빨리 알리고 change에 대해 설명한다.

 

For Reviewers

- 리뷰 전용 시간을 따로 정해둘 것

- 자주 리뷰하여 적은 change에 대한 리뷰를 할 수 있도록 한다.

- 가능하면 빠른 피드백을 해라

- 핵심 이슈에 집중하고, 사소한 일에 구애받는 것을 피해라

- 필요하다면 리뷰 체크리스트를 만들거나 사용해라

 

For Organization

- 긍정적인 리뷰 문화를 만들고 유지해라

- 코드 리뷰 정책을 개발, 반영, 수정하라

- 리뷰에 사용되는 시간이 계산되고 예상되는지 확인하고, 부정적인 영향을 주는지 확인해라

- 적절한 도구를 사용하는지 확인해라

- 적절한 리뷰 체크리스트에 대한 개발을 장려해라

- 코드 리뷰 활동을 위한 충분한 교육을 실시해라

- 프로세스에서 병목현상을 감시할 수 있는 메커니즘을 개발해라

 

<Trade-off>

코드 리뷰어를 선정하는데 있어 전문가나 시니어에게만 요청하면 주니어 팀의 성장 기회를 주기 어려워진다. 그리고 너무 많은 리뷰 유청이 전문가에게 집중되면 리뷰에 시간이 너무 오래 걸리고, 리뷰어들이 너무 많은 리뷰를 하다보니 정신이 없을 수 있다. 그래서 경험이 많이 필요하지 않은 리뷰 요청에 대해서는 주니어 팀을 활용하는 것이 좋다.

 

툴을 사용하는 것을 통해 시간을 절약할 수도 있지만 오히려 시간을 낭비하게 될 수도 있다. 왜냐하면 툴에 친숙해지는데 시간이 걸리거나, 툴을 사용하면서 오히려 프로세스가 느려질 수 있기 때문이다.

 

Q. 코드 리뷰를 특정 시간안에 진행하도록 강제하는 것이 필요할까?

<개인적인 의견>

코드 리뷰를 요청하는 쪽에서 자신이 요청하는 코드 리뷰의 난이도와 중요도를 정확하게 파악하는 것이 선행되어야 할것 같다. 이러한 정보가 리뷰어에게 같이 전달이 된다면, 리뷰어는 자신에게 쏟아지는 여러 코드 리뷰 요청들의 난이도와 중요도를 파악하여 일정을 스케줄링하여 빠른 시간안에 이루어져야 하는 리뷰를 우선적으로 처리할 수 있을 것이다.

그리고 개발자들에게 있어 리뷰를 하는 것은 중요한 일이긴 하지만, 메인 업무는 아니다. 그래서 리뷰를 특정 시간안에 하도록 강제하는 것인 실질적으로 이행되기는 힘들 것이라고 생각한다. 그래서 정말 급한 리뷰라면, 리뷰를 요청하는 쪽에서 다른 행동을 취하는 것이 맞다고 생각한다.

 

Q. 코드 리뷰를 요청하는 양식을 견고하게 정하는 것이 필요할까?

<개인적인 의견>

양식을 정하고, 양식을 따르는 것을 강제하게 하면 코드 리뷰를 요청하는 쪽에서는 리뷰를 요청하는 작업이 번거로워질 수 있지만, 이를 통해서 리뷰를 하는 쪽에서는 시간을 단축시킬 수 있을 것이다. 그리고 오히려 이렇게 하면 리뷰 요청을 준비하는데 걸리는 시간이 늘어나는 것이 비해 코드 리뷰를 진행하는 시간이 더 많이 단축될 것이라 생각하여 꼭 들어가야 하는 내용을 정하고 강제하는 것이 도움이 될 것이라고 생각한다. 그리고 오히려 양식에 어떤 내용이 들어가야 할지에 대한 논의가 필요하다고 생각한다.

 

참고자료

Code Reviewing in the Trenches: Challenges and Best Practices, Laura MacLeod, Michaela Greiler, Margaret-Anne Storey, Christian Bird, Jacek Czerwonka, IEEE, 2017

Abstract

GPU 클러스터에서 딥러닝 모델 학습의 대기 시간과 효율성을 향상시키기 위해 domain-specific knowledge를 활용하는 클러스터 스케줄링 프레임워크인 Gandiva를 소개한다.

Introduction

딥러닝의 해결 과제로는 best result를 얻기 위한 hyperparameters 튜닝을 위한 feedback-driven exploration과 이질적인 딥러닝 job에 대한 best-fit을 찾는 것이 있다. Gandiva는 mini-batch iterations의 predictability를 이용해서 profile-driven introspection을 수행하여 이를 해결한다. 실제로 프로토타입을 통해 Gandiva가 hyper-parameter search 시간을 단축시켰고, 더 좋은 효율적이고 명확하게 job을 마이그레이션과 시분할을 하여  job-to-resource fit을 얻을 수 있음을 보였다.

Background

딥러닝은 모델의 가중치를 이용한 연산인 forward pass 과정과 gradient를 이용해 각각의 가중치를 학습을 하는 backward pass 과정으로 이루어져 있다. 그리고 각각의 과정은 mini-batch iteration이라고 불린다. 그리고 이러한 iteration을 수백만번 반복하여 높은 task accuracy를 얻는다. Feedback-driven exploration은 hyper-parameters를 자동화해서 찾는 방법으로 이를 위해 multiple DLT job을 수행해야 하고 early-feedback을 통해 빠르고 효율적으로 수행된다. 

Method

Exclusive access to fixed set of GPUs는 HOL 블로킹을 발생시키고, 할당된 GPU를 전부 사용하지 못하기 때문에 낮은 GPU 사용률을 얻게 된다. 이를 해결하기 위해 Gandiva는 incoming job을 시분할 처리해서 waiting time을 줄이고 HOL 블로킹을 방지하였다. 그리고 다른 GPU로의 효율적인 migration을 지원하여 locality를 보장하며 GPU에 job을 할당시킬 수 있게 하였다. 그리고 GPU grow-shrink mechanism을 지원하여 idle GPU를 기회주의적으로 사용될 수 있게 했다. 그리고 스케줄링 정책에서 두가지 모드를 가지는데, 이벤트를 관리하는 Reactive Mode와 모니터링과 최적화를 진행하는 Introspective Mode를 가진다.

Contribution

딥러닝 workflow의 다양한 고유 특성을 설명하고 클러스터 스케줄링에 필요한 특정 요구 사항에 매핑였다.

DLT 작업 스케줄링 정책에서 사용할 수있는 일반적인 프리미티브를 식별하고 주기적으로 반복되는 작업의 딥러닝에 특화된 지식을 활용하여 시분할 및 마이그레이션과 같은 프리미티브를 훨씬 효율적이고 실용적으로 만드는 application-aware 기술을 제공하였다.

DLT 작업에 대한 도메인 별 지식을 활용하여 일정 결정을 지속적으로 세분화하여 early feedback 시간을 크게 개선하고 높은 클러스터 효율성을 제공하는 새로운 introspective 스케줄링 프레임워크를 제안하고 평가하였다.

 

참고문헌

Gandiva: Introspective Cluster Scheduling for Deep Learning - Wencong Xiao, 2018

+ Recent posts