2021 / 4 / 29 iMES 세미나
Abstract
- IoT 앱 개발 : device side + server side에서의 분리된 프로그래밍 포함
- simple한 app에서는 충분한 방법
- 복잡한 app에서는 적절하지 않다 ( 복잡한 interaction / 집중적인 data processing )
- Edgeprog 제안 ( edge 중심적 프로그래밍 접근법 )
- user : 중앙집중식으로 app logic을 쓸 수 있음
- augmented if-this-then-that ( IFTTT ) syntax
- 가상 센서 매커니즘
- 프로그램은 edge server에서 처리될 수 있음 ( 최적의 latency 달성 )
- 실제 app code 자동으로 생성
- device code와 server code를 지능적으로 분할
- 동적 linking / loading 사용
- start에서 app별 code를 실행하지 않는 다양한 IoT device에 device code를 배포
- 결과 ( 최신 접근법과의 비교 )
- 20.96%의 실행 latency 감소
- 79.41%의 code line 감소
- user : 중앙집중식으로 app logic을 쓸 수 있음
Introduction
- IoT 앱개발 : device측 + server측의 분리된 프로그래밍
- Ex) device 측에는 센서, server측에 분석을 위한 data를 전달하는 등
- 간단한 app 개발에는 효율적 / 복잡한 app 개발에는 적절하지 않음
Complex interactions
Ex) 문이 열릴 경우 센서가 감지하여 LED를 켜려고 함
기존 프로그래밍 스타일 : app logic이 다른 센서 node로 분산
- 시스템의 복잡성 증가 / 관리성 저하
Intensive data processing
- Ex) speech 인식 app 개발
- 방법
- 모든 센서 data를 복잡한 인식 알고리즘을 돌리는 server로 전송
- 과도한 에너지 소비 ( 많은 양의 trasmission )
- IoT device에서 인식 알고리즘 수행
- 과도한 delay 유발 ( 연산 파워의 부족 )
- 모든 센서 data를 복잡한 인식 알고리즘을 돌리는 server로 전송
- separate programming : 적절한 프로그래밍 방법을 선택해야함
- 엣지컴퓨팅의 인기 증가에 따라 다른 프로그래밍 접근법을 제안
- 다수의 IoT node : sensing / actuation ( 실행 ) 수행
- 각각 local edge로 연결됨 ( 복잡한 연산 수행 )
- edge server : power suffly 존재 / energy 제약사항이 적음
- edge computing : 적은 processing delay / 더 좋은 privacy 제공
- EdgeProg : 새로운 프로그래밍 스타일 / 시스템 구조
- IoT app 프로그래밍을 크게 단순화
- 전체 시스템의 효율 손실 없이 다양한 app에 대해 재프로그래밍될 수 있는 일반적인 IoT system
- 개발자 : high-level 언어 사용
- 전체 app logic + IoT app 통합
- 프로그램이 edge server에서 처리될 수 있음
- 실제 app code를 생성
- device code / server code로 분할
- edge-centric 접근법 : 프로그램이 edge에서 실행되어지는 듯한 효과
- 일반적인 IoT node : 처음부터 app별 code를 실행하지 않음
- app의 첫 실행에 IoT node의 메모리에 app별 code가 자동 load될 것
- Challenge
- 다중 device 상호작용 + data 집중적 연산을 지원하는 edge-centric 언어 설계 방법?
- user-인식 프로그램을 분할하여 최적의 delay를 달성하는 방법?
- 이기종 sensor node가 device측 code를 동적으로 load하고, 효율적으로 실행할 수 있도록 하는 매커니즘 설계 방법?
- 일관성 있는 언어 설계
- 목적
- edge 중심 프로그래밍 지원
- app 개발 프로세스 속도 향상
- 다중 device 상호작용 지정
- IFTTT 기반 언어 기반 / 확장
- 목적
- 표현력 높임
- data 집약적 연산 채택
- 가상 센서 사용
- 머신러닝으로 자신들의 data 처리 로직 설계를 가속화
- 목적
- 목적
- EdgeProg : 자동 코드 분할 수행
- 각 device의 연산 능력을 완전히 활용
- 최적의 latency 달성
- user가 작성한 프로그램 -> data flow 그래프로 추출
- partitioning 문제 -> integer programming 문제로 공식화
- 최적의 partition을 얻기 위해
lp_solve
해결자 사용
- Contiki OS에서 구현
- 플랫폼 교차지원
- 동적 linking / loading 기술 사용 -> 런타임에 최적화된 실행파일 load 능력 구현
- app 실행 중 app의 logic을 바꾸는 대안
- 가상머신 이용
- 스크립팅 언어 사용
- 대안을 사용하지는 않을 예정 ( 동적 linking / loading에 비해 overhead가 상당 )
- 구현 평가
- EdgeProg 언어 : 다양한 IoT app logic을 표현할 수 있음
- code line을 79.41% 줄일 수 있음
- 최신 partitioning 시스템과의 비교
- 평균 20.96% / 최대 99.05% 감소
- 동적 linking / loading 기술 사용과 대안책을 사용할 때의 비교
- 가상머신을 사용하는 경우 : 9.98X
- 스크립팅 언어를 사용하는 경우 : 6.37X
- 프로파일링 메소드 정확도 평가
- 85%+의 정확도
- EdgeProg 언어 : 다양한 IoT app logic을 표현할 수 있음
- contribution 요약
- EdgeProg ( IoT app을 위한 edge 중심적 프로그래밍 시스템 ) 제안
- 흩어진 app logic -> 사용하기 쉬운 방법으로 logic을 표현할 수 있도록 함
- task의 makespan을 최소화하기 위해 code 분할 문제를 공식화
- 분할 알고리즘 : 각 stage의 배치 최적화 ( 프로세싱 / 네트워크 latency를 모두 고려 )
- EdgeProg 개발 / 평가 ( 실제 app / 벤치마크 )
- 최신 연구들과 비교하여 latency 감소 / line 감소
- EdgeProg ( IoT app을 위한 edge 중심적 프로그래밍 시스템 ) 제안
Background and EdgeProg Usage
A. Background
Dynamic linking and loading of IoT devices
- IoT device의 over-the-air reprogramming 기술 중 하나 ( 과잉 재프로그래밍 )
- linking phase
- on-device reprogrammer : 파일의 구조화된 정보 -> 실행 가능하고 link 가능한 파일 ( ELF ) / 그것들의 변형 ( CELF / SELF ) 로 파싱
- ELF 파일의 data / text segment에 대해 ROM / RAM 등을 할당
- 재배치 수행 ( symbol table에서 발견되거나 ELF에서 재배치 정보를 사용하여 계산된 symbol의 실제 메모리 주소로 data 및 text segment를 패치 )
- loading phase
- text segment를 할당된 ROM에 write
- data segment를 RAM에 복사
- binary가 load되어짐 / 실행 준비 완료
- linking phase
- 대안들 ( 가상머신 / 부트로더 ) 와 비교하여 장점이 있음
- 높은 장기간 효율성 ( 가상머신 code 대신 고유 code를 실행하기 때문 )
- 재부팅이 없는 update ( 에너지 효율 )
Virtual sensor
- 다른 장소에 위치할 수 있는 실제 센서들로부터 감지한 데이터를 추상화하는 논리적 실체
- 전통적인 하드웨어 센서 : 물리적 특성의 raw 측정값만을 제공함
- 수익성이 없음 ( 높은 level의 domain 의존 정보로 변환해야만 수익성이 생김 )
- 값진 data를 얻기 위해서는 여러 sensor들의 조정이 필요함 ( 온도 / 연기 센서로 화재위험 감지 )
- 위의 한계점과 센서 data 처리를 유연하게 하기 위해 고안되어짐
- 여러 하드웨어 센서에서 감지된 data + 데이터 처리 알고리즘의 결합으로 일반적으로 물리적으로 측정할 수 없는 간접 측정 / 이벤트 제공
- EdgeProg : 기본 IFTTT 문법의 확장형 -> 집중적인 data 처리를 하기 위한 사용하기 쉽고 표현적인 처리 제공
B. EdgeProg Usage
Ex)
SmartHomeEnv
2개의 센서 ( 온도 / 습도 ) data를 입력으로 받음
에어컨 / 제습기를 켤 수 있음 ( 2개의 input이 threshold를 넘길 경우 )
2개의 센서 : edge server와 무선 연결 ( 라즈베리 파이 등 )
전통적인 관점 : edge server에 주기적으로 센서값 전송하는 기능이 있는 app별 code로 미리 설치
- edge : reading값을 처리 / 미리 정의된 인터페이스 사용 -> 센서와 상호작용
EdgeProg 사용 : app별 logic 없이 “idle” 프로그램으로 미리 설치
- 모든 app logic : 향상된 IFTTT 기반 언어로 구현
- edge 서버에서 해석 / 처리되어짐
예시
Application SmartHomeEnv { Configuration { // device와 그들의 interface 선언 TelosB A(TEMPERATURE); TelosB B(HUMIDITY); Edge E(turnOnAC, turnOnDryer); } Rule { // IFTTT를 따른 app별 login IF (A.TEMPERATURE > 30 && B.HUMIDITY > 70) THEN (E.turnOnAC && E.turnOnDryer) } }
- edge 서버 : code를 자동으로 2개로 분할
- device측 component / edge측 component
- device측 컴포넌트 : load 가능한 모듈로 컴파일 -> 센서 node로 전송
- 한번 notice하면, “idle” 프로그램이 실행을 위해 app별 모듈을 동적으로 load할 수 있음
- edge 서버 : code를 자동으로 2개로 분할
핵심
- 전체 app code를 자동으로 분할할 수 있음 -> 실행성능 최적화
- 전산집약적 IoT 작업에 필수적 ( 음성인식 / 영상감시 등 )
- device에 code를 배치하는 것보다 작업에서 더 나은 성능을 보이는 경우, edge 측으로 code를 분할
- 전체 app code를 자동으로 분할할 수 있음 -> 실행성능 최적화
EdgeProg Overview
A. Design Goals
Edge centric
- 개발 중에 app logic을 조각으로 분해할 필요가 없도록 edge-centric한 접근법 제공
Latency-aware
- edge device에 조정된 app에게 적시성은 치명적인 성능 문제와 직결
- EdgeProg : 주어진 input에 대한 시간최적 solution을 제공하는 능력이 필요
Automatic
- EdgeProg : user의 idea를 표현하는데 아무런 이득이 없는 세부사항을 구상 / app 개발을 단순화하고 가속화하기 위해 인간을 loop에서 제거한다는 것을 의미
B. EdgeProg Architecture
- user : edge-centric한 app code를 바로 작성할 수 있음
- 분산된 프로그래밍 스타일 / 각 stage에서 물리적 placement 등을 고려하지 않아도 됨
- system : user code를 input으로 받음
- 전처리, feed -> code partitioner로 전달
- code partitioner : 각 device의 time profile + 파티셔닝 알고리즘에 의해 각 stage에서의 최적의 파티션 / placement를 탐색
- code generator : user가 작성한 code 전처리 -> 컴파일이 가능한 code로 변환
- code compiler : 실행 가능 / load 가능한 binary로 변환
- 실행파일 : 공중을 통해서 배포 / edge device에 배치
User Input
- EdgeProg 프로그래밍 모델에 의해 작성되어짐
interface
에 의해 지정된 device에서 제공하는 actuatorimplementation
에 의해 지정된 가상 센서의 출력- 위를 이용하여 app logic을 지정하는 rule 개념 중심으로
Code Partitioner
- user input app에 대한 최적의 파티션 제공
Time profiler
- 각 스테이지의 시간 정보 : code partitioner의 중요한 input
- profiling phase : 다른 플랫폼에서의 실행 시간 얻음
- low-end 센서 node : cycle-accurate 시뮬레이터 사용
MSPsim
( MSP430 기반 node ( TelosB ) )Avrora
( AVR 기반 node ( MicaZ ) )- timing 정보를 얻기 위함
- high-end 센서 node : low-end보다 정확도가 낮음
- 원인 : 자동 frequency scaling 전략 사용 -> 시뮬레이터의 정확도 감소
- real device에서 raw timing data를 모으는 것은 좋지 않음, 실현 불가능함
- edge server의 하드웨어 interface의 한계
- high-end device를 profiling하기 위해
gem5
이라는 cycle-accurate 시뮬레이서 근접 방법 채택
Network Profiler
- 네트워크 상태 : 파티션에 공급되는 주요 metric
- deploy되었을 때 network 상태 파악 방법 : M-SVR 알고리즘 사용
- Multiple-output support vector regression : 간격 시퀀스에서의 미래 네트워크 상태를 나타내는 예측 시퀀스를 생성
- loading agent에서 0.1Hz로 샘플링된 대역폭 / RSSI 등이 fed되어짐
- predictor : 미래 throughput / 패킷당 전송시간 추정치 출력 ( 추가 세분화 시간 계산 목적 )
- 예측 알고리즘 : 시스템의 블랙박스 역할
- 다른 예측 알고리즘 사용해도 괜찮음
- deploy되었을 때 network 상태 파악 방법 : M-SVR 알고리즘 사용
Code Generator
- 생성된 최선의 파티션 : code generator에서 진행되어짐
- high-level의 EdgeProg 언어 -> 컴파일 가능한 C code로 변환
Code Compiler
- 받은 code -> 실행가능 파일로 변환 ( target flatform에 맞춰서 )
- 이후 배포 시작
- 현재 4개의 플랫폼 / 4개의 MCU 구조 지원 ( ATMega, MSP, ARM, x86 )
Loading Agent
- 시스템 초기 : loading agent를 제외하고 node에서 실행되는 app별 logic이 없음
- edge와 주기적 통신 : 새로 load 가능한 app을 위함
- app이 컴파일 이후 배포되기 시작할 때, 목적지에 있는 loading agent : 실행 가능 감지 / 검증 / 수신
- 이후 동적으로 실행
System Design
A. EdgeProg Programming Language
- EdgeProg : DSL 언어 수용 ( 개발자들이 app 개발할 때 사용하는 언어 )
- 흩어진 프로그래밍 스타일의 문제점 해소 / app 개발 프로세스 가속 목적
- Rule-based Domain-Specific Language
- app : 3개의 파트로 구성되어짐
- configuration / implementation / rule
Edge-centric programming model
- edgeprog : edge 중심 설계 목표
- implementation의 세부사항보다 global behavior에 user를 집중시켜야함
- 개발자 :
Rule
키워드 활용 -> 전체 app logic을 중심으로 app 구성 가능
- 여러 DSL이 있음 : sensornet 연구에서 개발자가 macro-programming model에 집중할 수 있음
- 최근에는 기존 연구가 좋지 않음 ( app 이동성, 작동 부족 등에 대한 제약조건 )
- IFTTT 프로그래밍 기법 : 다른 연구들에 비해 단순 / 효율적 ( hight-level app logic을 표현할 때 )
- 첨단 산업 솔루션으로 활용 중
- edgeprog에서도 비슷한 문법 활용 : 통일되고 명시적인 방식으로 자신의 아이디어 표현 가능
Configuration
,Implementation
추가 :Rule
파트에서 사용될 구성요소의 세부 정의 / 사양 등 표현
Full support of virtual sensor
- 요즘의 방대한 data 처리를 수용하기 위해 DSL를 가상 센서를 이용하여 강화
- 가상 센서 : 복잡한 data 처리 알고리즘을 표현하는 효율적인 접근법
- feature 추출 / 분류 2가지 단계로 구성
- 가상 센서 : 복잡한 data 처리 알고리즘을 표현하는 효율적인 접근법
- 가상 센서
VoiceRecog
- A.MIC 인터페이스 : 입력 음성 단편 생성
- 가상 센서 : 입력된 음성이 “open”인지 아닌지 인식
- FE / ID 두 단계로 구성된 pipeline
- 각 stage마다
setModel()
존재 ( 음성인식 지원 )
- 각 stage마다
- 17개의 data 처리 알고리즘 ( 12개의 추출 / 5개의 분류 )
- FE / ID : 일반적인 pipeline 구성
- 2개 이상의 여러 stage / 병렬 stage도 지원함
- green 개발자 : 어떤 센서가 어떤 예상 출력과 어떤 관련이 있는지 모름 -> 복잡성이 높음
- 완화 방법 : inference-agnostic 가상 센서
- 관련 센서 set와 가상 센서 예상 출력 제공
- 완화 방법 : inference-agnostic 가상 센서
- edgeprog : 처음에 샘플 app을 생성
- 개발자 : 충분한 training data를 얻기 위해 원하는 event를 기록해야함
- edgeprog : 입력 센서 <-> 기록된 event 간의 관계를 반영하는 모델 훈련
- 이후 다른 가상 센서와 비슷하게 분할 / 보급
Explicit data flow
- 약 45%의 code line이 data flow 구축 / 상호작용을 위해 작성되어짐
- 상당한 양 / 프로젝트의 복잡성 증가 원인
- 여러 device 상호작용 : 네트워크 패킷 구성에서 생기는 data flow를 더 복잡하게 함
- 일반적인 IoT app에서의 data flow : 센서 data로부터 생성 / 시작 ( 여러 알고리즘으로부터 생성 )
- database에 저장되거나, 실행 IoT 노드로 command-back
- So, 이 3 단계에 data flow를 명시적으로 제작
- 개발자 : data 및 사용 가능한 action을 인터페이스로 지정
- 사용 가능한 인터페이스 : 공급업체 / prototype 개발자에 의해 결정되어짐
- 데이터 처리 목적 -> 가상 센서, rule : 인터페이스 직접 사용 / 호출 -> 통일적이고 명시적인 data flow 초래
B. Code Partitioning
- code 분할 subsystem 목적 : 적절한 stage로의 user input 분리 / 각 stage마다 최선의 placement 얻기
- 사용자 input app -> 연산 stage를 나타내는 logic block으로의 전처리
- rule의 data flow 그래프 생성 ( app logic, stage 의존도 파악 목적 )
- latency-ware : edgeprog의 설계 목적 중 하나
- latency 최소화 문제 공식화 / 각 stage의 최적 배치를 찾는 solver 사용
- 파티셔닝 알고리즘 핵심 : 연산을 data source와 가깝게 밀어넣음 / 각 device의 연산능력을 최대한 사용하여 latency 감소 달성
- edgeprog : 좋은 연산-전송 tradeoff를 달성하는 최적의 placement 찾을 수 있음
Logic blocks and data flow graph construction
- 더 이상의 구현 / 최적화가 불가능한 2가지 차이가 있음 ( 이 프로그래밍 언어의 compact한 특성 )
- 일부 stage : 암시적으로 정의되고, app에서 사용될 수 있음
rule
stage에서 필요하지만, 그것이 app에서 구상되어지는 경우가 있음
- 토플로지 정보 : 전체 최적화에 필요 ( 그런데 이것도 app에서 암시되어짐 )
- 일부 stage : 암시적으로 정의되고, app에서 사용될 수 있음
- 차이 해소 방법 : node가 logic block으로 표시되는 app의 data flow graph를 구성
- logic block : app의 독립적인 building block
- code 생성을 위한 input source 포함해야함
- 배치 / 알고리즘 / 시간 profiling에 필요한 파라미터 등의 정보 포함해야함
- tuple <functionality, placement>로 정의되어짐
- functionality
SAMPLE
,ACTUATE
,CONJ
의 tenet에서의 tasklet primitive 차용 ( 광범위한 data 수집 / 처리 작업을 위한 building block )- 가상 센서 배치를 수용하기 위한 알고리즘 primitive 추가 ( GMM )
- logic block의 data 소스 : primitive의 첫번째 argument로 선언되어짐
- placement
- 2종류의 code block : pinned / movable
- pinned : 물리적으로 구속된 기능
SAMPLE
: device에 배치되어야만 함
- placement : 고정된 block에 고정되어짐
- logic block에서 해당 device 별칭 사용
- movable : 불확실성을 표기하기 위해 ? 같이 표시
- device / edge에 잠재적으로 배치됨
- pinned : 물리적으로 구속된 기능
- 2종류의 code block : pinned / movable
- logic block : app의 독립적인 building block
- 명시적으로 선언된 logic block 제외하고 일부 block : 완전그래프에서도 필요 / 사용자 app에서 암시적으로 그려짐
- 내재된 block으로 data flow graph 완성하기 위해서는,
Rule
에서 정의된 모든 규칙을 아래와 같은 전략으로 분석- IF-statement에서 가상 센서를 활용하는 조건에서,
Implementation
부분 참조하여 stage pipeline 확보 / SAMPLE 블록 삽입 - 센서 값만을 비교하는 조건에서는, 2개의 stage로 변환 ( SAMPLE, CMP )
- CONJ 블록 : IF-statement에서 모든 conjunction 표기
- Then-statement에서의 각 action : 2개의 block으로 변환
- AUX : 보조 movable 블록 ( statement가 edge / local에서 실행될 것임을 나타냄 )
- ACTUATE : 고정 블록 ( action을 나타냄 )
- IF-statement에서 가상 센서를 활용하는 조건에서,
- data flow graph : 유향 비순환 그래프로 나타내어질 것
- 정점 : logic block
- 간선 : data flow가 있음을 나타냄
- 내재된 block으로 data flow graph 완성하기 위해서는,
The ILP problem for optimal partitioning
data flow graph의 존재 : 최선의 파티셔닝 문제 -> 수치 최적화 문제로 공식화 가능
- 최선의 파티셔닝 결과 : logic block을 각각 가장 선호되는 연산 device에 할당하는 것
- 할당 결과 : 이진값 $X_{b_is_i}$로 표기 ( 1이면 할당 / 0이면 비할당 )
이전에 있던 파티셔닝 알고리즘을 가져와서 사용 ( Wishbone )
2가지 차이점에 의해 이곳에서 실현될 수 없음
- Node weight
- 그래프에서 해당 logic block의 처리 시간을 나타내는 vertax에 weight 할당할 때의 문제
- movable block의 가중치 : local / edge 서버 처리시간의 2배
- wishbone graph에서의 vertax 가중치 : 1개의 weight
- Optimization goal
- wishbone에서의 최적화 목표 : 연산 budget / 네트워크 bandwidth 최소화
- edgeprog에서의 최적화 목표 : latency에 초점
- 서로 원하는 최적화가 달라 공식이 적합하지 않음
- Node weight
edgeprog의 목적 : task 실행 latency 최소화 ( data flow 그래프에서 가장 긴 path의 길이를 최소화 )
전체 경로를 source 정점 -> sink 정점으로 표시 ( p )
len(p) : p의 길이
δ(p) : p에 있는 정점의 개수
P(G) : 그래프 G에 있는 모든 전체 경로 집합
최적화 목표값 : $min max_{p∈P(G)}len(p)$ ( p의 경로의 최댓값을 최소화 )
추가로, len(p) == 모든 가능한 placement에 걸친 데이터 처리 / 전송 latency의 합이므로, $X_{b_is_i}$를 포함하여 공식화 가능 \(\underset{X}{\operatorname{\arg min}}\underset{p\in{P(G)}}{\operatorname{\max}} \sum_{i=1}^{\delta(p)}\sum_{s_i\in{S_i}} X_{b_is_i}{T_{b_is_i}^C} + \sum_{i=1}^{\delta(p)-1}\sum_{s_i\in{S_i}\\ s_{i'}\in{S_i'}} X_{b_is_i}X_{b_{i'}s_{i'}}T_{b_is_is_{i'}}^N\)
$i$, $i’$ : 경로 p의 인접 정점 ( $i’ = i + 1$ )
$S_i$ : i번째 logic block을 설치할 수 있는 모든 공간의 집합
$T_{b_is_i}^C$ : i번째 블럭을 $s_i$에 설치 했을 때의 데이터 처리 시간
$T_{b_is_is_{i’}}^N$ : i번째 블럭과 i+1번째 블럭 사이의 데이터 전송 시간
같은 위치 $s_i == s_{i’}$ 이라면 무시 가능 \(T_{b_is_is_{i'}}^N = \begin{cases} \lceil{\frac{q_{ii'}}{r_{ii'k}}}\rceil t_{ii'k} & s_i\ne s_{i'}\\ 0 & s_i = s_{i'} \end{cases}\)
- $q_{ii’}$ : edge에서 전송되어지는 data size
- $r_{ii’k}$ : 프로토콜 k의 최대 패킷 payload를 나타내는 프로토콜 고유 metric
- $t_{ii’k}$ : 각 패킷 전송 시간 ( 네트워크 profiler에 의해 측정 / 예측 )
위의 방정식 : Quadratic max/min problem ( NP-Hard 문제 )
첨단 기술 : 휴리스틱 방식으로 해결
- 최근 연구 : 그리디 bfs 알고리즘을 utilize
- 반면, local 최적에 덜 노출되어지는 solver를 사용하는 것을 선호
방정식을 재공식화하여 integer programming problem으로 재구성 (
lp_solve
등의 standard solver로 해결 가능한 문제 )$\epsilon_{is_is_{i’}}=X_{b_is_i}\cdot X_{b_{i’}s_{i’}}$ : quadratic 목적함수 -> 선형함수로 변환하여주는 보조변수
이것이 존재하는 경우, 다음과 같은 제약조건 도입 \(\begin{aligned} \epsilon_{is_is_{i'}} &\geq 0 \\ \epsilon_{is_is_{i'}} &\leq X_{b_is_i} \\ \epsilon_{is_is_{i'}} &\leq X_{b_{i'}s_{i'}}\\ \epsilon_{is_is_{i'}} + 1 &\geq X_{b_is_i} + X_{b_{i'}s_{i'}} \\ \text{when } (\forall{i\in\delta(p)-1, s_i\in S_i, s_{i'}\in S_{i'}}) \end{aligned}\)
- 4개의 제약조건은 모두 linear함
여전히 minmax 문제이므로, max 함수를 대표하는 보조변수 z를 선언
z -> 제약조건의 set으로 변경하여 표준 ILP 공식을 따르도록 함
재작성된 목적함수는 아래와 같음 \(\text{Objective: } \underset{X}{\operatorname{arg min}} z\)
\[\text{Subjective: } z\geq \sum_{i=1}^{\delta(p)}\sum_{s_i\in{S_i}} X_{b_is_i}{T_{b_is_i}^C} + \sum_{i=1}^{\delta(p)-1}\sum_{s_i\in{S_i}\\s_{i'}\in{S_i'}} \epsilon_{is_is_{i'}} T_{b_is_is_{i'}}^N, \forall{p}\in{G}\]제약 추가 : 모든 logic block은 특정 device 하나에만 존재할 수 있다. \(\sum_{s_i\in{S_i}} X_{b_is_i}=1, \forall{i}\in{p}\in{G}\)
So, 위의 모든 식들을 이용하여 계산한 Objective의 최적해가 input app의 최적 분할
C. Executable Generator
- 2개의 step으로 구성
- 최적의 파티션과 logic block으로부터 컴파일 가능한 code의 조각을 구성하는 단계
- 플랫폼에 맞게 실행 가능하도록 code를 컴파일하는 단계
- Contiki OS와 비슷하게, 감지 device뿐만 아니라 edge server에 대한 code도 생성할 수 있었음
- 각각 플랫폼에 맞는 toolchain으로 컴파일
- 처리해야할 유일한 차이점 : 다른 플랫폼에서 사용되어지는 다른 라이브러리 / 샘플링 API
- 초점 : 어떻게 컴파일 가능한 code를 효율적으로 실행되도록 생성할 것인지?
- logic block : app의 building block 역할을 할만큼 표현 가능하도록 설계되어짐
- 최종 컴파일 가능한 code의 function으로 변환되어짐
- issue : 생성된 code에서 function call을 구성하는 방법?
- 직관적인 접근법 ( event-driven kernel / Contiki OS의 protothread 기술을 수용하기 위함 ) : 같은 placement에 할당된 모든 logic block을 protothread 안에 배열한 후, 다음 block이 다른 device에 할당된 경우 데이터 주고받기
- 간단하지만, 성능 면에서 단점이 있음 ( 설계상 protothread가 매우 길어질 수 있음 -> 시스템 성능 저하 )
- 하나의 block당 하나의 protothread를 만드는 것 또한 효율적이지 못함
- 짧은 protothread : 많은 process 전환 overhead 초래 -> 전체 makespan에 해악 초래
- edgeprog의 접근법 : Contiki의 필수품인 code template / 수신 callback이 있는 send thread 기반 접근법
- 기능적 protothread : 최적화된 유향 비순환그래프의 fragment로부터 생성
- 각 device의 fragment : 배치 변화 지점에서 끝나는 그래프 dfs를 활용하여 얻을 수 있음
- 이후 logic block의 함수를 호출하여 하나의 조각으로 protothread 조립
- thread의 끝 : 데이터 전송을 위해 send thread에게 event 발생시킴
- 다른 thread에게 yield
- time profiling : 그래프 fragment는 system health를 위해 몇가지 시간소모적인 task를 포함하고 있다면, 더욱 세분화될 수 있음
- 직관적인 접근법 ( event-driven kernel / Contiki OS의 protothread 기술을 수용하기 위함 ) : 같은 placement에 할당된 모든 logic block을 protothread 안에 배열한 후, 다음 block이 다른 device에 할당된 경우 데이터 주고받기
Evaluation
A. Experiment Setup
- 5개의 macro-benchmark 사용할 것 ( 2개의 센싱 app / 3개의 real-world app )
- Sense : outlier detection / data 압축 등을 하는 일반적인 센싱 app
- MNSVG : 온도 / 습도를 예측하기 위해 MNSVG 모델을 사용하는 날씨 예측 app
- EEG : wishbone으로부터 취해진 seizure 감지를 위한 EEG signal 사용
- 각 channel : 7차 wevelet 분해로 EEG 신호를 처리 ( 10개의 병렬채널 )
- SHOW : device의 궤적을 IMU 정보, 랜덤 forest 알고리즘 등으로 감지 / 분류
- Voice : 신호처리 / 분류 알고리즘 등을 이용하여 speaker 수를 셈
Baseline Definition
- edgeprog와 비교할 첨단연구를 소개
- RT-IFFFF : 서버가 모든 연산 수행
- 센서 : 값을 전달 / 실행만 함
- Wishbone(0.5, 0.5) : CPU / network 자원을 반반 쓰는 파티셔닝 시스템
- Wishbone(opt.) : CPU / network workload를 최소로 하는 상태의 파라미터를 사용하는 wishbone
- RT-IFFFF : 서버가 모든 연산 수행
B. Latency reduction
- 평균적으로 20.96% 감소 / 최대 99.05% 감소
- 2가지 주요 관찰결과
- 벤치마크에 따라 속도 상승률이 상당히 다름
- 변화 원인 : 각 벤치마크의 계산복잡성 / 네트워크 요구량의 차이
- Zigbee 네트워크에서의 edgeprog 성능 > WIFI 네트워크에서의 edgeprog 성능
- 가능한 모든 절단 지점에서 각 벤치마크를 철저히 실행함으로써 증명
- 네트워크 속도 증가 = 데이터 전송시간 감소 / 데이터 처리에 시간을 지배적으로 사용
- 최적화 알고리즘 : 초기에 작업을 offload하는 것을 선호
- 따라서, WIFI에서의 전환점이 Zigbee보다 왼쪽에 존재함
- 최적화 공간의 감소 의미 ( 기준선과 비슷한 성능 초래 )
- 벤치마크에 따라 속도 상승률이 상당히 다름
C. Overhead
Disemination Overhead
- 알고리즘의 복잡성이 클수록 binary 크기가 증가
- 연산이 많아도 binary가 작은 경우가 있음
- 각 절차가 동일한 절차를 공유하기 때문 ( 주로 하나의 알고리즘 사용 )
Run-time efficiency
- 동적 링크 / 로딩 기술 runtime 효율성 측정 ( 가상머신 / 스크립팅 언어 )
- 결과
- VM을 사용하였을 때 실행시간은 매우 김
- edgeprog 언어를 사용하지 않았을 때보다 더 많은 실행시간 초래
D. Programming Language
- Contiki 스타일 / Edgeprog 스타일 비교
- 결과
- edgeprog : 평균 79.41%의 line 감소 나타냄
- 복잡한 장치간 상호작용 작성 완화 / 기타 문법 필수사항 작성 완화
- 가상센서 / IFTTT 추상화 방법 또한 기여
- edgeprog : 더 많은 device가 포함된 app 개발의 복잡성 감소
- 모든 장치에 대한 개별코딩이 필요하지 않기 때문
- edgeprog : 평균 79.41%의 line 감소 나타냄
E. Profiling Accuracy
- TelosB가 더 높은 정확도 달성
- 라즈베리파이가 정확도가 조금 불안정한 모습 ( CPU의 주파수 변동 / 라즈베리 파이의 배경 처리 기인 )
Related Work
Conclusion
- 프로그램을 자동으로 분할 / 생성 / 보급 / 로드하는 EdgeProg 제안
- 개발자가 상세한 구현으로부터 완화될 수 있는 edge 중심 프로그래밍 시스템
- 개발자 / 비전문가에게 사용하기 쉽고 표현력이 좋은 프로그래밍 언어 제공
- 코드 파티셔너 : ILP 공식을 통해 응용프로그램의 각 부분에 대해 가장 효율적인 배치를 찾음
- 핵심 : 각 device의 계산 능력을 최대한 활용 / latency 감소 달성