HyperAIHyperAI

Command Palette

Search for a command to run...

비셩(Bi Sheng)의 컴파일러 코어인 AscendNPU IR이 오픈소스로 공개되었습니다. 화웨이 아키텍트 하이 리쥐안(Hai Lijuan)은 기술적 진전을 설명하고 트라이톤(Triton)과 같은 통신 사업자 생태계 지원 기능을 강조했습니다.

Featured Image

8월 1일HyperAI가 주최하는 제9회 Meet AI Compiler 기술 세미나가 예정대로 개최되었습니다.베이징 인공지능 연구원, TileRT 팀, 텐센트, 화웨이, 지위안 이노베이션 등 유수 기업 및 연구기관의 초청 연사들이 언어 표현, 연산자 연산, 추론 실행, 시나리오 구현 등 다양한 측면에서 AI 컴파일러의 협력적 발전에 대해 심도 있는 논의를 진행했습니다. 이들은 기술적 난제, 실질적인 해결책, 산업 동향에 초점을 맞춰 AI 컴파일러 기술의 발전 과정과 산업적 가치에 대한 심층적인 탐구에 다양한 아이디어와 실무 경험을 제공했습니다.

현장에서,화웨이 AscendNPU IR의 아키텍트인 하이 리쥐안은 "AscendNPU IR: 오픈 소스 컴파일 기반, Ascend에 대한 다국어 접근 지원"이라는 주제로 자신의 견해를 공유했습니다.그녀는 AscendNPU IR 컴파일러 구성 요소의 전반적인 기술 아키텍처와 설계 철학을 체계적으로 소개하고, Ascend 950 확장 기능을 위한 AscendNPU IR의 새로운 기능, 기술적 반복 개발의 이점, 그리고 생태계 커뮤니티 구축에 대해 자세히 설명했습니다. 또한 오픈 소스 플랫폼의 핵심 기능과 기술적 장점을 분석하고, 다양한 프런트엔드 언어와의 호환성을 시연했으며, AscendNPU IR을 통해 개발자들이 쉽고 편리하게 협업할 수 있는 환경을 제공했습니다.

하이리쥐안 선생님께서 제9회 AI 컴파일러 모임에 참석하셨습니다.
하이리쥐안 선생님께서 제9회 AI 컴파일러 모임에 참석하셨습니다.
HyperAI는 원문의 의미를 변경하지 않고 발표 자료들을 종합하고 요약했습니다.

위챗 공식 계정 "HyperAI"를 팔로우하고 "0801 AI 컴파일러"라는 키워드로 답글을 보내시면 강사님의 공식 발표 PPT를 받으실 수 있습니다.

Triton 프로그래밍이 효율적이고 사용하기 쉬운 이유는 무엇일까요?

프로그래밍 언어로서 트라이톤은 효율적이면서도 사용자 친화적입니다. 그렇다면 이러한 개발상의 이점은 어디에서 오는 것일까요?

간단히 말해, Triton은 Python과 유사한 구문을 사용하고 블록 레벨 타일 프로그래밍을 제공합니다. 이를 통해 개발자는 추상 커널의 하드웨어 메모리, 명령어, 파이프라인 및 기타 연산과 같은 저수준 세부 사항에 신경 쓰지 않아도 되므로 운영자 개발 장벽을 낮추고 개발 효율성을 향상시킬 수 있습니다.

Triton의 Tile 프로그래밍 모델은 C++와 같은 이기종 프로그래밍 언어와 비교했을 때 기존 프로그래밍 언어에 비해 여러 장점을 제공합니다.이를 통해 개발자는 연산자에 대한 데이터 분할에 더욱 집중하고, 텐서 연산자 추상화 및 논리 표현식에 집중할 수 있습니다.타일 수준의 프로그래밍 추상화를 기반으로, 사용자가 관리하는 코어 간 데이터 스케줄링을 제외하고는 코어 내 메모리 접근 병합 및 공유 메모리 관리는 컴파일러가 자동으로 완료할 수 있습니다.

더욱 중요한 것은 Triton 방언과 공식 Triton GPU 컴파일러 모두 MLIR 기반의 다단계 IR 추상화를 기반으로 구축되어 있어 다양한 하드웨어에 대한 심층적인 최적화가 가능하다는 점입니다.

AscendNPU IR은 아키텍처 최적화 작업을 지속적으로 진행하고 있습니다.

AscendNPU IR은 MLIR을 기반으로 구축된 Ascend 하드웨어 타일 수준 추상화 계층으로, 기본 컴파일 최적화를 제공합니다. 해당 아키텍처는 아래 다이어그램에 나와 있습니다.**AscendNPU IR은 LLVM IR과 하위 인터페이스를 형성하며, 최종적으로 Ascend 하드웨어 바이너리에 컴파일됩니다.**Triton과 같은 타사 언어 및 컴파일러를 AscendNPU IR에 통합할 수 있으므로 Ascend와의 호환성이 확보됩니다.

AscendNPU IR의 주요 기술적 특징첫째, AscendNPU IR은 Ascend 하드웨어에 대한 하향식 추상화를 제공하여 메모리 및 데이터 전송 장치와 같은 코어 내의 다양한 리소스를 추상화합니다. 둘째, 추상적인 타일 수준 연산자를 제공하여 A2/A3부터 Ascend 950 SIMD 및 SIMT에 이르는 최신 하드웨어 아키텍처를 포괄하는 통합된 크로스 아키텍처 지원을 가능하게 합니다. MLIR의 개방성과 확장성을 기반으로 AscendNPU IR은 더 상위 계층 언어에서의 접근을 지원합니다.

아래 다이어그램은 Ascend A2/A3부터 올해 출시된 최신 Ascend 950 하드웨어에 이르기까지 AscendNPU IR 컴파일 아키텍처 설계를 보여줍니다. 왼쪽은 작년에 출시된 AscendNPU IR 아키텍처의 첫 번째 버전으로, 주로 두 개의 계층으로 구성됩니다. 상위 계층은 하드웨어 독립적인 계층인 HFusion으로, 주로 다차원 융합 최적화를 구현합니다. HFusion은 커뮤니티 Linalg 및 확장된 OP를 기반으로 다양한 표준 방언과 연결하여 데이터 유형 및 OP 정규화 전처리, 자동 스케줄링과 같은 융합 최적화를 수행합니다.

하드웨어 관련 계층인 HIVM은 주로 Ascend 하드웨어에 대한 고수준 추상화를 수행하며, 코어 매핑 컴파일, 온칩 메모리 매핑 및 처리 장치 매핑을 순차적으로 완료합니다.

첫 번째 단계는 커널 매핑 컴파일입니다.여기에는 큐브 커널과 벡터 커널이 포함됩니다. 고수준 타일 표현은 커널을 통해 매핑되며, 큐브 커널은 큐브 커널에, 벡터 커널은 벡터 커널에 할당됩니다. 커널 간의 데이터 통신, 데이터 동기화 및 중간 작업 공간 메모리 관리는 모두 컴파일러에 의해 자동으로 완료되며, 컴파일러는 컴퓨터 비전 파이프라인 병렬 처리를 위한 고차 최적화도 수행합니다.

다음은 온칩 메모리 매핑입니다. Cube 코어와 Vector 코어 모두 자체 온칩 메모리를 가지고 있습니다. Ascend 하드웨어에서 Tensor를 사용하려면 논리적 Tensor 데이터를 해당 물리적 메모리로 추론해야 하며, Cube 전용 프랙탈 행렬 형식도 도출해야 합니다. 온칩 메모리 할당은 모두 컴파일러가 자동으로 처리합니다.

가장 하위 레벨은 처리 장치 매핑입니다.파이프라인 동기화는 타이밍과 병렬 효율성을 보장합니다. 벡터화 및 텐서 양자화는 고성능 하드웨어 명령어를 통해 최종 컴파일 최적화를 완료할 수 있도록 합니다.

다이어그램의 오른쪽에는 작년 A2/A3에서 올해 Ascend 950 아키텍처로의 주요 변경 사항이 나와 있습니다. 상위 하드웨어 독립 계층인 HFusion은 대체로 안정적으로 유지되었으며, 주요 확장 사항은 하드웨어 종속 계층인 HIVM에서 이루어졌습니다. HIVM은 메모리 기반 SIMD에서 레지스터 기반 SIMD 및 SIMT를 지원하도록 확장되었습니다. 이전에는 CV 융합 컴파일 시 전역 메모리를 통해 큐브 코어와 벡터 코어 간의 상호 작용이 이루어졌지만, Ascend 950은 보다 효율적인 데이터 상호 작용을 위해 긴밀하게 연결된 방식을 구현했습니다.

전반적으로 새로운 아키텍처는 여전히 안정적인 2계층 구조를 유지하지만, 아키텍처 변경으로 인해 타일 컴파일이 크게 향상되었습니다.

먼저 벡터 레지스터 기반 SIMD 아키텍처의 진화를 살펴보겠습니다. 메모리 기반 SIMD에서는 통합 버퍼를 사용하여 온칩에서 벡터 연산을 수행하고, 명령어는 온칩 메모리에서 직접 실행됩니다. Ascend 950에서는 고속 레지스터를 사용하여 연산을 수행하므로 레지스터 계층이 하나 더 추가됩니다. 특히 벡터 연산과 관련된 백엔드 최적화를 위해 컴파일 과정이 다음과 같이 변경됩니다.

첫째, 레지스터 기반 시스템을 위한 벡터화입니다. 텐서 연산은 벡터화된 파티셔닝을 통해 고정 폭 레지스터 명령어로 매핑됩니다. 데이터는 온칩 메모리에서 레지스터로 로드되고, 레지스터를 기반으로 연산이 수행된 후, 데이터는 다시 온칩 메모리에 저장되어 로드-연산-저장 루프를 형성합니다.

둘째, 레지스터 세분성 융합. 온칩 메모리에서 데이터를 반복적으로 로드하고 언로드하는 작업은 비효율적입니다. 레지스터 기반의 딥 퓨전은 데이터를 레지스터에 상주시킬 수 있도록 합니다. 여러 Triton 작업을 단일 루프로 통합하면 로드 저장 공간을 줄일 수 있습니다. 이를 위해서는 다양한 탐색 알고리즘과 비용 모델을 활용하여 더 나은 퓨전 전략을 개발해야 합니다.

**셋째, AVE 방언 추상화.**Ascend의 사용자 친화적인 벡터 다이얼렉트 확장 기능은 하드웨어 마스크 차이를 숨겨 마스크 분석 및 유도를 가능하게 합니다. 하드웨어 벡터 로드는 풍부한 인패스 최적화 기능을 제공합니다. 인패스 연산을 활성화하면 여러 명령어를 하나의 명령어로 결합할 수 있습니다. 이러한 모든 최적화는 Regbase SIMD 다이얼렉트를 위해 특별히 설계되었습니다.

Ascend 950 하드웨어는 아래 이미지에서 녹색으로 표시된 것처럼 SIMT 유닛을 지원합니다. 이를 통해 벡터 코어는 순수 SIMD, 순수 SIMT, 그리고 SIMT와 SIMD를 번갈아 실행하는 하이브리드 모드 등 세 가지 연산 모드를 사용할 수 있습니다. SIMT는 개별 메모리 접근 시나리오를 가속화할 수 있으며, 고밀도 연산은 SIMD를 활용하여 더욱 적극적인 벡터 최적화를 수행할 수 있습니다.

벡터 SIMD 또는 SIMT 컴파일을 진행하기 전에 컴파일 프로세스는 융합 분석 및 최적화를 수행합니다. 이 과정에서 SIMT에 적합한 구성 요소를 식별하고, SIMT 및 SIMD 컴파일을 위해 해당 구성 요소를 추출한 다음, 전체 벡터 계산을 위해 이들을 결합합니다. 이 과정에서 SIMT와 SIMD 모두 모델링 및 분석됩니다.

어텐션 유형 연산자와 밀접하게 관련된 것은 컴퓨터 비전 커널의 업그레이드 및 변경입니다. A2/A3 프로세서에서는 Cube와 Vector가 온칩 연결이 부족하여 오프칩 글로벌 메모리를 통해서만 상호 작용할 수 있습니다. 그러나 Ascend 950에서는 그림에서 빨간색으로 표시된 것처럼 Cube 결과가 L0C에 저장되어 Vector의 온칩 메모리로 직접 복사될 수 있습니다. 반대로 Vector의 연산 결과 또한 후속 Cube 연산을 위해 Cube의 온칩 메모리로 직접 복사될 수 있습니다. 요컨대, 컴퓨터 비전에서 긴밀한 연결과 빠른 데이터 교환은 어텐션 성능 최적화에 크게 기여합니다.

컴퓨터 비전(CV) 연산자 최적화를 위한 핵심 기술 중 하나는 CV 파이프라인 병렬 처리입니다. Ascend Automation의 CV 파이프라인은 지연 시간을 효과적으로 숨기고 Cube 코어와 Vector 코어의 컴퓨팅 성능을 최대한 활용할 수 있습니다.

**또 다른 핵심 최적화 기능은 자동 하위 타일링입니다.**Ascend Cube 및 Vector 코어는 1:2 비율로 구성되어 있으며, Vector 코어 두 개가 Cube 코어 하나에 대응합니다. 컴파일러는 Vector 연산을 1:2 블록 분할 방식으로 수행하여 각 Vector 코어가 데이터의 절반씩을 동시에 계산할 수 있도록 함으로써 계산 속도를 향상시킵니다.

컴파일러의 기능 일반화 작업 최신 버전

본 논문에서는 새로 출시된 AscendNPU IR 버전에서 중요한 기능들의 일반화 작업에 대해 소개합니다.

첫째: CV 데이터 상호작용. 큐브 및 벡터 연산에 관련된 코어 간 데이터 상호 작용은 컴파일러에 의해 자동으로 완료됩니다. Triton 연산자의 큐브 및 벡터 계산은 제어 흐름의 여러 분기에 분산될 수 있으므로 컴파일 및 분석 프로세스가 복잡해집니다. 패턴 매칭을 통한 간단한 명령어 삽입은 불가능합니다. 위 예시에서 두 분기는 각각 큐브 및 벡터 계산을 수행합니다. 기능적 완전성을 보장하기 위해서는 CV 데이터 상호 작용이 복잡한 제어 흐름 파생을 지원해야 합니다.

새 버전은 InsertCVLoadStore의 주요 패스 분석 프로세스를 개선하여 복잡한 제어 흐름 전반에 걸친 전역 유도를 통해 CV 데이터 상호 작용을 완성합니다. 먼저, 결정론적 기준점을 삽입합니다. 행렬 곱셈 연산은 입력이 L1이고 출력이 L0C이며, 벡터 연산은 입력과 출력 모두 UB에 있습니다. 그런 다음, 초기 기준점을 기반으로 형변환 연산을 삽입하여 제어 흐름 전반에 걸쳐 상향 및 하향 유도와 전파를 수행합니다. 전파 후, 모든 피연산자 텐서의 메모리 레벨이 명확하게 정의됩니다.

위 예시에서 볼 수 있듯이, 텐서는 원래 메모리 계층 구조 의미 체계를 포함하지 않습니다. 타입 캐스팅 연산(Op)을 삽입하면 벡터 코어의 UB 메모리에 저장되고, 그 아래에는 큐브 코어의 L1 메모리가 있습니다. 파생 과정에서 메모리 계층 구조의 불일치로 인해 충돌이 발생하며, 데이터 연결을 설정하기 위해 로드-스토어 또는 복사 문을 삽입해야 합니다. 이러한 처리 방식은 세대별로 약간씩 다릅니다. A2/A3 큐브 및 벡터는 데이터 연결을 설정하기 위해 전역 메모리 로드-스토어 문을 삽입해야 하는 반면, Ascend 950은 온칩 데이터 복사를 통해 데이터 연결을 설정합니다.

두 번째: MultiBuffer는 복잡한 제어 흐름을 향상시킵니다. 멀티버퍼는 파이프라인 및 병렬 처리를 위한 필수 조건입니다. 그렇다면 텐서를 멀티버퍼로 변환하는 방법은 무엇일까요?

기존 방식은 for 루프만 지원했습니다. 루프 반복 중에 MultiBuffer는 for 루프의 반복 변수를 재사용하여 이 변수에 따라 버퍼 슬롯을 순환시켰습니다. 하지만 이 방식은 while 루프나 중첩된 제어 흐름을 지원하지 못하는 한계가 있었습니다. 따라서 독립적인 버퍼 카운터를 도입했습니다. 이 카운터는 분기 루프를 포함한 복잡한 제어 흐름을 따라가며 슬롯 변경을 정확하게 추적합니다.

또한, Cube와 Vector의 공통 루프 계층에서 할당 작업이 보이도록 해야 Cube와 Vector가 2개 또는 3개의 버퍼를 할당하는 것과 같은 메모리 할당 작업을 동시에 수행하여 MultiBuffer 변환의 일관성을 보장할 수 있습니다.

**세 번째: AutoBlockify는 Ascend 연산자 최적화와 밀접하게 관련된 멀티코어 변환 기능입니다.**CUDA 또는 Triton 연산자를 작성할 때 일반적으로 코드를 여러 논리 블록으로 나누고 하드웨어 스케줄링을 통해 실행합니다. Ascend는 반복적인 라운드 로빈 스케줄링에 크게 의존합니다. 서로 다른 논리 코어를 단일 for 루프로 통합하고 소프트웨어 루프 스케줄링을 통해 성능을 최적화합니다. 또한, for 루프 내에서 MultiBuffer 및 파이프라이닝과 같은 고급 최적화 기법을 적용하여 기본 성능을 더욱 향상시킬 수 있습니다.

네 번째: 이력서 파이프라인.예를 들어, FlashAttention 연산자는 Cube와 Vector라는 두 개의 코어에 분산된 네 개의 태스크를 가지고 있으며, 이 태스크들은 각각 별도로 실행됩니다. 이 태스크들은 순차적으로 실행되며, Cube와 Vector의 계산은 서로를 기다려야 합니다. 컴파일 과정에서 MultiBuffer를 사용하면 Cube와 Vector가 최대한 빨리 실행되도록 하여 파이프라인 병렬 가속 효과를 얻을 수 있습니다.

먼저 C/V 경계점을 식별한 다음 코드 세그먼트를 큐브 범위와 벡터 범위로 정확하게 나눕니다. 그다음, MultiBuffer를 적용하여 다양한 전략 모드(언롤, 스큐, 동적)를 포함하는 스케줄링 알고리즘에 기반한 파이프라인 병렬 변환을 구현합니다. 다양한 연산 부하에 따라 최적의 파이프라인 병렬 모드를 선택할 수 있습니다.

다섯 번째: CV 1:2 분할.두 개의 벡터 커널과 하나의 큐브 커널은 협력하여 원시 텐서 데이터를 가능한 한 정확하게 절반으로 나누어 처리함으로써 효율적인 벡터 연산을 수행합니다. 이상적으로는 고차원에서 병렬 축을 찾아 전역적인 절반 분할을 수행해야 합니다. 그러나 후보 축은 전치, 브로드캐스트, 축소와 같은 연산 작업을 거칠 수 있으며, 이로 인해 CV 1:2 분할의 복잡성이 증가할 수 있습니다.

먼저, 전역 차원 분석을 수행하여 분할에 가장 적합한 축을 식별합니다. 분할 축이 결정되면, 저장 작업의 끝에서 시작하여 루트 노드까지 분할 작업 시작 마커를 삽입하고, 이 마커를 따라 위쪽으로 진행하여 완벽한 분할을 구현합니다. 분할이 불가능한 복잡한 시나리오가 발생하는 경우에는 보수적인 1:1 분할되지 않은 상태로 되돌립니다.

또한, 일부 복잡한 시나리오에서는 단순히 병렬 축을 분할하는 것만으로는 성능 향상에 충분하지 않습니다. 예를 들어, FB8 저정밀 어텐션 알고리즘은 높은 벡터 부하를 발생시키므로 축소 축을 분할하고 축소해야 합니다. 두 벡터 커널은 직접 데이터를 교환할 수 없으므로, 중간 축소 결과를 글로벌 메모리를 통해 교환하여 2차 축소를 수행하고, 이를 통해 전체적인 축소 및 분할을 완료해야 합니다. 또한, 동적 형상과 같은 시나리오에서도 향상된 CV 1:2 분할 방법이 필요합니다.

Triton-Ascend와 AscendNPU IR은 오픈 소스이며 공동으로 개발되었습니다.

AscendNPU IR이 이제 Ascend 커뮤니티에서 오픈 소스로 공개되었습니다. 이미지의 QR 코드를 스캔하여 오픈 소스 프로젝트를 팔로우할 수 있습니다. AscendNPU IR 커뮤니티 SIG의 격주 회의 일정이 커뮤니티 활동 캘린더에 게시되었습니다. 개발자는 매주 논의 주제와 회의록을 미리 확인할 수 있습니다.

Ascend 커뮤니티는 개발자들이 생태계 구축에 참여할 수 있도록 오픈 소스 인턴십 프로젝트와 커뮤니티 과제를 시작했습니다. 최신 과제 현황은 여기에서 확인하고 참여하고 싶은 과제를 신청할 수 있습니다. 이러한 커뮤니티 과제는 난이도가 다양하므로 자신의 능력에 맞춰 선택하고 참여해 주세요.

AscendNPU IR 및 Triton-Ascend 오픈 소스 저장소 홈페이지의 빠른 링크를 통해 오픈 소스 인턴십 및 커뮤니티 과제에 참여할 수 있으며, 과제 신청 절차도 확인할 수 있습니다. 한 번에 하나의 과제만 신청할 수 있습니다. 커뮤니티 과제는 정기적으로 업데이트되며, 개발 과정은 지속적으로 소통 가능하고 개방적으로 진행됩니다. 각 과제는 푸짐한 보상을 제공하므로 누구나 자유롭게 선택할 수 있습니다.

Ascend 개발 환경이 없는 참가자를 위해 커뮤니티에서는 무료 Ascend 컴퓨팅 플랫폼인 HiDevLab(https://hidevlab.huawei.com/home)을 제공합니다. 개발자는 등록 후 컴퓨팅 파워를 신청할 수 있으며, 신청이 승인되면 기본적으로 100시간의 무료 컴퓨팅 시간이 할당됩니다. 커뮤니티 과제를 수락한 개발자는 과제 개발 및 검증을 완료하기 위해 컴퓨팅 파워를 신청할 수 있습니다.

관심 가져주셔서 감사합니다!