제퍼넷 로고

이기종 아키텍처의 프로그래밍 프로세서

시간

프로그래밍 프로세서는 점점 더 다양한 유형의 처리 요소가 동일한 아키텍처에 포함됨에 따라 더욱 복잡해지고 있습니다.

시스템 아키텍트는 전력, 성능 및 영역을 개선하기 위해 사용할 수 있는 옵션의 수에 만족할 수 있지만 기능을 프로그래밍하고 모든 기능을 함께 작동시키는 문제가 주요 문제로 판명되었습니다. 여기에는 다양한 IP 공급자의 여러 프로그래밍 도구, 모델 및 접근 방식이 포함됩니다.

"Nest 카메라, 자동차 애플리케이션의 카메라, 노트북 등 모든 종류의 에지 추론 제품에는 기본적으로 세 가지 유형의 기능 소프트웨어가 있으며 주로 데이터 과학자, 임베디드 개발자 등 세 가지 유형의 개발자가 제공합니다. CPU 개발자와 DSP 개발자”라고 말했습니다. 쿼드 릭.

그리고 개발 프로세스의 어느 위치에 있느냐에 따라 접근 방식이 매우 다르게 보일 수 있습니다. Roddy는 "데이터 과학자는 Python에서 프레임워크 교육 및 수학적 추상화 수준에서 작업하는 데 시간을 보냅니다."라고 말했습니다. "PyTorch는 매우 높은 수준이고 추상화되고 해석되며 구현 효율성에 크게 신경을 쓰지 않습니다. 그들이 관심을 두는 것은 수학의 이득 함수, 모델의 정확도 등이기 때문입니다. 거기에서 나오는 것은 PyTorch 모델, ONNX 코드입니다. , PyTorch 모델에 내장된 Python 코드. 임베디드 개발자는 완전히 다른 성격 유형입니다. 이들은 CPU 공급업체의 도구, Arm 도구 키트 또는 C/C++ 개발용 Microsoft Visual Studio와 같은 일반적인 도구일 수 있는 보다 전통적인 도구 세트와 함께 작동합니다. 그리고 그것이 어떤 CPU인지에 관계없이 특정 칩에 대한 공급업체의 개발 스튜디오 버전을 얻을 수 있으며 RTOS 코드 및 드라이버 코드와 같은 미리 빌드된 것들이 함께 제공됩니다. 특정 벤더로부터 칩 레벨 솔루션을 구입하는 경우 DDR용 드라이버, PCI 인터페이스 등이 포함됩니다.”

예를 들어 고도로 추상화된 iPhone용 애플리케이션 프로그래밍을 고려하십시오. "많은 다른 소프트웨어가 쌓여 있는 iPhone 개발자를 위한 개발자 키트가 있습니다."라고 그는 말했습니다. “하지만 대부분 내장형입니다. 누군가가 C 코드를 작성하고 누군가가 Zephyr든 Microsoft OS든 그와 유사한 운영 체제를 도입하고 있습니다. 그리고 그들은 무엇을 생산합니까? 그들은 컴파일러의 품질에 따라 C 코드, 때로는 어셈블리 코드를 생성합니다. 알고리즘 개발자이기도 한 DSP 개발자는 종종 수학자 지향적이며 MATLAB 또는 Visual Studio와 같은 도구를 사용합니다. 여기에서 세 가지 수준의 코드가 생성됩니다. Python과 유사한 데이터 사이언스 코드, DSP, C++ 및 임베디드 코드입니다.”

Android 개발자인 Ronan Naughton의 렌즈를 통해 제품 관리 이사인 Ronan Naughton은 “일반적인 소프트웨어 엔지니어는 여러 플랫폼에 배포할 모바일 앱을 개발할 수 있습니다. 이 경우 그들은 Arm CPU 및 지원 도구 체인의 편재성으로 제공될 수 있는 가장 낮은 유지 관리 오버헤드, 원활한 휴대성 및 고성능을 찾고 있을 것입니다.”

안드로이드 환경에서 CPU용 프로그래밍은 가능한 가장 광범위한 도구 선택을 가능하게 합니다.

"예를 들어" Naughton은 "LLVM 또는 GCC와 같은 우수한 벡터화 컴파일러는 여러 CPU 및 OS 대상을 대상으로 할 수 있습니다. ML용 Arm 컴퓨팅 라이브러리와 같은 기능별 작업을 위한 풍부한 라이브러리 에코시스템이 있습니다. 또는 개발자는 Arm C 언어 확장과 같은 내장 기능을 사용하여 명령어 세트 아키텍처 자체를 대상으로 할 수 있습니다.”

그 아래에는 NPU, DSP 및 CPU로 구성된 기존 아키텍처와 대상 호스트 CPU에 도달하는 데 필요한 모든 단계가 있습니다. 그들 모두 또는 대부분은 어떤 형태의 런타임 애플리케이션을 사용하고 있습니다.

Roddy는 "머신 러닝 코드를 실행하는 경우 CPU는 각 추론, 각 반복에 적극적으로 참여하고 각 머신 러닝 그래프를 통해 전체를 조율합니다."라고 말했습니다.

그림 1: 기존 NPU+DSP+CPU의 도구/코드 흐름. 출처: Quadric.io

그림 1: 기존 NPU+DSP+CPU의 도구/코드 흐름. 출처: Quadric.io

그림 1: 기존 NPU+DSP+CPU의 도구/코드 흐름. 출처: Quadric.io

DSP, CPU 및 NPU를 프로그래밍하는 방법은 애플리케이션, 사용 사례, 시스템 아키텍처 및 환경에 따라 다릅니다. 이는 특정 애플리케이션 또는 사용 모델에 대해 최상의 성능을 달성하기 위해 코드를 최적화하는 방법을 결정합니다.

"CPU에서 대부분의 컴파일러는 코드를 매우 잘 최적화할 수 있지만 DSP 또는 NPU를 프로그래밍할 때, 특히 코드를 병렬화하려면 모든 컴파일러가 실패하기 때문에 소프트웨어 엔지니어가 많은 작업을 수행해야 합니다."라고 부서장인 Andy Heinig가 말했습니다. 효율적인 전자 장치를 위해 Fraunhofer IIS의 적응형 시스템 엔지니어링 부문. “이는 하드웨어에서 더 많은 병렬 작업을 수행할수록 더 많은 작업을 소프트웨어 엔지니어가 수동으로 수행해야 한다는 것을 의미합니다. 그리고 대부분의 작업은 저수준 프로그래밍에서 필요합니다.”

약간 겹치는 부분이 있지만 이러한 서로 다른 처리 요소 사이에는 몇 가지 기본적인 차이점도 있습니다. "CPU는 범용 아키텍처이므로 기존의 낮은 수준의 C에서 높은 수준의 C++, Python, 웹 애플리케이션 및 Java에 이르기까지 광범위한 사용, 운영 체제, 개발 도구, 라이브러리 및 많은 프로그래밍 언어를 지원합니다."라고 말했습니다. Guy Ben Haim, 제품 관리자 Synopsys. “DSP 애플리케이션은 일반적으로 최적화된 실시간 시스템에서 실행되므로 DSP 프로세서를 프로그래밍하려면 저수준 언어(예: 어셈블리, C), DSP 라이브러리 및 특정 컴파일러/프로파일러를 사용하여 데이터 병렬화, 성능 튜닝 및 코드를 허용해야 합니다. 크기 최적화. 범용 CPU와 달리 DSP와 유사하지만 NPU 아키텍처는 특정 작업을 가속화하는 데도 사용됩니다. 이 경우에는 AI/ML 애플리케이션을 가속화합니다.”

DSP 아키텍처는 여러 센서의 데이터를 병렬로 처리할 수 있습니다. 그리고 기존의 CPU 또는 DSP 프로그래밍은 데이터를 처리하기 위해 일련의 규칙이 있는 프로그램 또는 알고리즘에 의존하지만 AI는 데이터에서 학습하고 시간이 지남에 따라 성능을 향상시킵니다.

Ben Haim은 "AI는 PyTorch 및 TensorFlow와 같은 높은 수준의 프레임워크를 사용하여 모델을 생성, 교육 및 배포합니다."라고 설명했습니다. "신경망 모델은 인간 두뇌의 뉴런 구조에서 영감을 얻었으며 입력 데이터를 기반으로 예측이나 결정을 내릴 수 있는 시스템의 수학적 표현으로 구성됩니다."

다른 차이점도 있습니다. Tensilica Vision 및 AI DSP의 제품 마케팅 및 관리 그룹 이사인 Pulin Desai는 C 및 C++와 같은 고급 언어로 프로그래밍하는 것 외에도 운율, “DSP와 CPU도 math lib, fp lib와 같은 다양한 라이브러리를 활용합니다. DSP는 또한 특수 용도의 애플리케이션을 수행하기 위해 주소를 지정할 수 있는 특정 수직에 대한 특정 라이브러리를 가지고 있습니다. DSP와 CPU는 고객이 애플리케이션을 개발하는 데 사용하는 OpenCL 및 Halide와 같은 고급 언어에서도 작동합니다.”

NPU 프로그래밍은 AI 교육 프레임워크를 사용하여 완전히 다른 환경에서 수행됩니다. 그런 다음 TensorFlow 및 PyTorch에서 신경망 코드를 생성하고 신경망 컴파일러를 사용하여 특정 하드웨어에 맞게 네트워크를 추가로 컴파일합니다.”

“신경망은 '프로그래밍'되지 않습니다. 그들은 훈련을 받았습니다.'”라고 Synopsys의 제품 관리자인 Gordon Cooper는 말했습니다. “DSP와 CPU는 보다 전통적인 방식으로 프로그래밍됩니다. 코드는 C/C++로 작성되었습니다. 그런 다음 코드를 테스트하고 편집하려면 IDE와 디버거가 필요합니다.”

프로그래밍 모델 작동 방식
따라서 CPU 및 DSP의 경우 설계자는 C 또는 C++로 프로그래밍하지만 특정 lib api를 호출할 수 있습니다. "예를 들어 비전의 경우 코드가 OpenCV API 호출을 호출할 수 있습니다."라고 Desai는 말했습니다.

그림 2: DSP/CPU와 NPU의 임베디드 소프트웨어 개발 비교. 출처: 케이던스

대부분의 경우 코드를 최적화하는 작업은 수작업으로 이루어진다고 Fraunhofer의 Heinig는 말했습니다. “고수준 프로그래밍 모델은 하드웨어를 병렬로 사용할 때 실패하는 경우가 많습니다. 하지만 기본적으로 고도로 최적화된 기능을 가진 라이브러리를 사용하는 것은 물론 가능합니다.”

AI 모델 개발은 매우 다릅니다. 여러 단계가 필요합니다. Synopsys의 Ben Haim은 “첫 번째는 식별과 준비입니다. “AI가 해결하기에 적합한 문제를 파악한 후 올바른 모델을 선택하고 그 과정에서 사용할 데이터를 수집하는 것이 중요합니다. 두 번째는 모델 교육입니다. 모델을 훈련한다는 것은 모델을 최적화하고 성능을 개선하며 정확성을 보장하기 위해 많은 양의 훈련 데이터를 사용한다는 것을 의미합니다. 세 번째는 추론입니다. AI 모델은 프로덕션 환경에 배포되며 사용 가능한 데이터를 기반으로 빠른 결론, 예측 및 추론을 만드는 데 사용됩니다.”

다른 차이점도 있습니다. 대부분의 DSP는 데이터 배열을 병렬로 효율적으로 처리할 수 있도록 아키텍처가 조정된 벡터 프로세서입니다. Synopsys의 수석 제품 관리자인 Markus Willems는 “하드웨어를 효율적으로 사용하려면 데이터를 벡터화해야 합니다. “최적화 컴파일러는 스칼라 코드에서 시작할 때 어느 정도의 자동 벡터화를 적용할 수 있습니다. 그러나 대부분의 사용 사례에서 최적의 결과를 얻으려면 프로그래머가 전용 벡터 데이터 유형을 사용하여 벡터화된 방식으로 코드를 작성해야 합니다.”

Willems는 명령어 세트의 모든 기능을 활용하기 위해 내장 함수가 일반적으로 사용된다고 제안했습니다. "일반 어셈블리 코딩과 달리 내장 함수는 레지스터 할당을 컴파일러에 맡기므로 코드 재사용 및 이식성이 가능합니다."

또한 대부분의 DSP 알고리즘의 경우 기능적 성능을 분석하기 위해(즉, 알고리즘이 문제를 해결하는지 확인하기 위해) MATLAB에서 설계가 시작됩니다. 점점 더 많은 DSP의 경우 MATLAB 임베디드 코더 및 프로세서별 DSP 라이브러리를 사용하여 MATLAB 알고리즘을 벡터화된 DSP 코드에 매핑하는 직접적인 경로가 있습니다.

그러나 프로세서를 완전히 활용하려면 하드웨어와 소프트웨어를 공동으로 최적화해야 한다고 Heinig는 말했습니다. “그렇지 않으면 설계된 하드웨어가 문제 사양에 잘 맞지 않는다는 것을 너무 늦게 깨달을 수 있기 때문에 솔루션에 실패할 것입니다. 점점 더 많은 작업을 병렬로 실행하려는 경우 특히 그렇습니다.”

SoC 설계자의 경우 하드웨어 및 소프트웨어 아키텍처를 구동할 대상 시장 및 대상 응용 프로그램이 될 항목부터 시작합니다.

“프로그래밍 가능성과 고정 하드웨어 중에서 선택하는 것은 항상 어려운 일입니다.”라고 Desai는 설명했습니다. “결정은 비용(SoC 영역), 전력, 성능, 시장 출시 시간 및 미래 보장에 따라 결정됩니다. 대상 응용 프로그램을 알고 전력 및 영역을 최적화하려는 경우 고정 하드웨어가 가장 좋습니다. [한 예로 H.264 디코더가 있습니다.] 신경망은 끊임없이 변화하므로 프로그래밍 가능성은 반드시 필요하지만 일부 기능은 고정 기능(NPU와 같은 하드웨어 가속기)에 있고 일부는 프로그래밍 가능한 CPU 또는 DSP는 AI에 가장 적합합니다.”

처리 분할
이 모든 것은 다양한 디자이너/프로그래머가 다양한 코드를 담당할 수 있기 때문에 더욱 복잡해집니다.

"우리는 추론 응용 프로그램에 대해 이야기하고 있지만 시스템을 만드는 시스템 회사에 대해서도 이야기하고 있습니다."라고 Desai는 말했습니다. "그리고 SoC는 범용이기 때문에 특정 문제를 해결하기 위해 특정 신경망을 개발할 AI 개발자가 있을 수 있습니다. 예를 들어 마이크의 소음을 줄이기 위한 소음 감소 네트워크, 보안 카메라용 사람 감지 네트워크, 이 네트워크는 SoC에서 실행할 수 있는 코드로 변환해야 하므로 도구를 사용하여 신경망을 CPU/DSP/가 있는 SoC에서 실행할 수 있는 코드로 변환하는 방법을 알고 있는 프로그래머가 있어야 합니다. NPU. 그러나 실시간 응용 프로그램인 경우 실시간 OS, 프로세서 수준의 시스템 소프트웨어 등을 다룰 줄 아는 시스템 소프트웨어 엔지니어도 필요합니다. 이것이 소비자 장치인 경우 GUI 또는 사용자 인터페이스.”

NPU의 경우 몇 가지 고려 사항이 있습니다. Ben Haim은 "첫째, NPU는 AI 워크로드를 가속화하도록 설계되어야 합니다."라고 말했습니다. "AI/NN 워크로드는 딥 러닝 알고리즘으로 구성되어 있으며 많은 계층에서 많은 수학 및 다중 행렬 곱셈이 필요하므로 병렬 아키텍처가 필요합니다."

그는 우수한 NPU의 주요 특징 중 하나가 TOPS/MAC에서 측정된 성능으로 데이터를 처리하고 신속하게 작업을 완료하는 능력이라고 설명했습니다. “전력/성능/면적(비용) 간의 일반적인 반도체 트레이드오프는 NPU 설계의 경우에도 매우 관련이 있습니다. 자율 자동차 사용의 경우 NPU의 대기 시간은 특히 자동차 브레이크를 밟을 시기를 결정하는 것이 삶과 죽음의 문제일 때 중요합니다. 이는 기능 안전 설계 고려 사항과도 관련이 있습니다. 설계 팀은 또한 NPU 설계가 안전 요구 사항을 준수하는지 고려해야 합니다.”

프로그래머를 위한 또 다른 주요 고려 사항은 개발 및 프로그래밍 도구입니다.

"인기 있는 AI 프레임워크에서 NN/AI 모델을 쉽게 가져오고, 컴파일하고, 최적화하고, 메모리 설계를 포함한 NPU 아키텍처를 자동으로 활용할 수 있는 적절한 소프트웨어 개발 도구 없이 훌륭한 NPU를 구축하는 것만으로는 충분하지 않습니다. 고려 중”이라고 말했다. “프로그래머가 하드웨어가 존재하기 훨씬 전에 소프트웨어 개발 및 검증을 시작할 수 있도록 모델의 정확성을 확인하는 방법과 시뮬레이션 도구를 제공하는 것도 중요합니다. 이것은 시장 출시 시간에 대한 중요한 고려 사항입니다.”

쿠퍼는 동의했다. “NPU는 완전히 유연한 DSP, 특히 GPU나 CPU보다 맞춤형 가속기에 가깝습니다. 상당한 시간 동안 NN 성능이 강력하게 필요한 경우가 아니면 NPU 추가를 선택하지 않을 수 있습니다. 약간의 AI만 필요한 고객은 DSP 성능을 위해 벡터 DSP를 사용하고 다이 공간의 최대 유연성을 보장하기 위해 필요할 때 AI를 처리하도록 재구성합니다. 이것은 괜찮지만 전용 NPU만큼 전력 또는 면적 효율적이지는 않습니다.”

마지막으로 그래프의 어떤 하위 집합이 NPU에 적합하고 어떤 것이 적합하지 않은지 결정하려고 할 때 프로그래밍 문제가 발생합니다. [위 그림 1의 왼쪽 참조]

"그렇지 않으면 다른 곳에서 실행해야 하므로 코드를 분할해야 합니다."라고 Quadric의 Roddy는 말했습니다. “이와 함께 메모리에 저장되는 보조 명령 스트림 생성기 또는 연결 목록 생성기가 있으며 NPU는 명령을 가져올 만큼 충분히 알고 있습니다. 이 부분은 매우 간단하지만 시스템에서 실행되지 않는 모든 비트는 어떻게 됩니까? 이러한 연산자는 어디에서 실행해야 합니까? 이미 존재하는 기계 학습 연산자의 효율적인 구현이 있습니까? 그렇다면 여기 DSP에 있습니까, 아니면 존재하지 않으면 CPU에 있습니까? 누군가는 새로운 버전을 만들어야 합니다. 높은 성능을 원하기 때문에 DSP에서 이 작업을 수행하고 있습니다. 이제 DSP에서 코드를 작성해야 하며 많은 DSP에는 좋은 도구, 특히 기계 학습을 위해 특별히 제작된 도구가 부족합니다. 일반 버전의 DSP(오디오 DSP 또는 기본 범용 DSP)에는 두 개의 MAC 또는 쿼드 MAC 유형이 있을 수 있습니다. 기계 학습을 위해 구축된 DSP의 종류는 매우 넓은 DSP입니다. 매우 넓은 DSP는 매우 넓은 활성화 및 정규화와 데이터 과학에서 발생하는 유형의 좋은 대상이 될 수 있지만 참신하여 견고한 컴파일러가 없을 수 있습니다.”

결론
과거에는 이러한 프로그래밍 세계가 별도의 분야였습니다. 그러나 AI 컴퓨팅이 장치에 점점 더 많이 포함되고 시스템이 점점 이기종화됨에 따라 소프트웨어 개발자는 적어도 다른 영역에서 무슨 일이 일어나고 있는지 훨씬 더 많이 인식해야 합니다.

궁극적으로 이는 엔지니어링 팀이 두세 가지 유형의 프로세서를 분할하지 않고도 복잡한 C++ 코드를 작성하고 실행할 수 있게 해주는 단일 하드웨어/소프트웨어 아키텍처의 원동력이 될 수 있습니다. 그러나 이런 일이 일어나려면 지금과 그때 사이에 해야 할 일이 많습니다. 그리고 AI 및 하드웨어 아키텍처가 진화하는 속도를 고려할 때 해당 아키텍처가 준비될 때까지 여전히 관련성이 있는지 여부는 완전히 명확하지 않습니다.

spot_img

최신 인텔리전스

spot_img