


JIT로 컴파일하는 GPU 커널 라이브러리에 커널을 추가하고 테스트하기
쓸 때 컴파일하는(JIT) GPU 커널 라이브러리를 AI가 다룰 때 쓴다. 커널을 모든 계층에 거쳐 추가하고, 생성 파일은 쓰기 가능한 폴더에만 두며, GPU 종류별로 테스트하고, 결과가 맞는지 확인한 뒤 속도를 잰다.
이 AI 규칙을 사용하려면
## 커널을 고치면 자동으로 다시 컴파일되는 편집 가능 설치 준비하기
환경의 기존 프레임워크와 가속기 버전을 유지하는 편집 가능 설치 방식을 사용하라.
격리된 의존성 해석이 호환되지 않는 런타임 패키지를 가져올 수 있다면 이를 비활성화하라.
빌드하거나 테스트하기 전에 필요한 모든 원본 하위 모듈을 초기화하라.
적시 컴파일을 기본 개발 반복 과정으로 취급하라.
커널 원본을 편집하고 범위가 명확한 테스트를 실행한 다음, 원본 해시가 재컴파일을 시작하게 하라.
패키징 코드 자체가 변경되지 않았다면 커널을 편집할 때마다 패키지를 다시 설치하지 마라.
오래된 산출물이 진단 대상에 포함될 때만 JIT 캐시를 비워라.
첫 사용 속도를 높이거나 배포에 필요한 경우에만 사전 컴파일된 커널 패키지를 사용하라.
일반 개발에서는 사전 컴파일된 산출물을 선택 사항으로 유지하라.
감지된 로컬 GPU 이외의 장치용으로 빌드할 때는 대상 아키텍처를 명시적으로 설정하라.
사용 가능한 메모리에 따라 컴파일러 스레드와 병렬 빌드 작업 수를 제한하라.
전체 컴파일 메모리를 작업 수, 컴파일러 스레드 수, 스레드별 요구량의 곱으로 추정하라.
테스트 매개변수 크기로 인해 피할 수 있는 장치 메모리 고갈이 발생하지 않게 하라.
정확한 하드웨어 시간 측정이 필요할 때만 프로파일링 지원을 설치하라.
검토 전에 포매팅과 저장소 훅을 실행하라.
## 생성 파일은 쓰기 가능한 작업 공간에만 쓰고 설치 폴더에는 쓰지 않기
각 컴파일 도구 체인을 공통 사양 인터페이스로 표현하라.
각 사양에 고유한 이름, 원본 목록, 컴파일러 플래그, 링커 플래그, 지원 아키텍처를 부여하라.
공유 빌드 및 로드 템플릿을 사용해 캐시 조회, 잠금, 컴파일, 로드를 조정하라.
수명 주기를 명시적으로 유지하라. 먼저 캐시 로드를 시도하고, 필요하면 빌드한 다음, 컴파일된 모듈을 로드하라.
비활성화 플래그가 설정되어 있고 유효한 캐시 모듈이나 사전 컴파일 모듈이 없다면 JIT 컴파일을 거부하라.
설치된 패키지 디렉터리는 읽기 전용일 수 있으므로 생성 파일을 절대 쓰지 마라.
원본 템플릿과 사전 컴파일된 패키지 데이터를 읽기 전용으로 유지하라.
렌더링된 원본과 복사한 컴파일 단위는 생성 원본 작업 공간에만 써라.
객체 파일, 공유 라이브러리, 메타데이터, 빌드 파일은 JIT 산출물 작업 공간에만 써라.
정확한 원본 목록과 컴파일 플래그로 빌드 매니페스트를 생성하라.
공유, 임시 또는 제한된 환경에서 작업 공간 위치를 재정의할 수 있게 하라.
아키텍처 컨텍스트를 사용해 감지된 장치와 명시적으로 요청한 대상을 결합하라.
컴파일이 시작되기 전에 모듈을 지원되는 아키텍처 계열로 제한하라.
요청한 아키텍처가 하나도 지원되지 않으면 명확하게 실패하라.
다른 장치 계열용으로 알리지 않고 컴파일하지 마라.
## 새 커널을 디바이스 코드부터 공개 API까지 추가하기
원시 포인터와 이식 가능한 커널 타입을 대상으로 프레임워크에 종속되지 않는 장치 코드를 구현하라.
재사용 가능한 커널 포함 계층에 프레임워크 헤더를 넣지 마라.
바인딩 계층에 런처를 추가하여 텐서를 검증하고 호출 매개변수를 준비하라.
프로젝트의 타입 지정 언어 간 FFI를 통해 런처를 내보내라.
특수화 매개변수에서 결정론적인 작업 URI를 계산하라.
쓰기 가능한 원본 작업 공간 아래에 작업별 생성 디렉터리를 만들어라.
구체적인 타입 또는 매개변수 특수화가 필요할 때만 템플릿을 사용하라.
내용이 다를 때만 렌더링된 구성을 써라.
필요한 컴파일 단위를 생성 디렉터리에 복사하라.
URI, 원본, 플래그, 아키텍처 제한을 포함하는 컴파일 사양을 반환하라.
로드된 모듈을 재사용하는 캐시 적용 상위 API를 제공하라.
배포에 필요한 경우 사전 컴파일 패키지 생성을 위해 작업을 등록하라.
패키지 진입점에서 공개 API를 내보내라.
축, 입력, 출력, 선택적 참조를 정의하는 추적 템플릿을 연결하라.
계획 및 실행 API에서는 실행을 수행하는 메서드에 추적을 연결하라.
현실적인 추적 예제를 추가하고, 벤치마크 정의 산출물을 다시 생성한 다음, 예상 출력을 커밋하라.
재생성 후 추적 일관성 테스트와 엔드투엔드 테스트를 실행하라.
## 지원하지 않는 GPU는 테스트에서 건너뛰고 속도 주장은 정확성 확인과 함께 내기
광범위한 검증에는 전체 테스트 스위트를 실행하고, 반복 작업 중에는 범위가 명확한 테스트를 실행하라.
중앙 역량 도우미를 통해 지원되지 않는 하드웨어를 의도적으로 건너뛰어라.
API가 해당 판정 함수를 제공한다면 장치의 컴퓨팅 역량과 백엔드 지원을 모두 확인하라.
각 기능의 아키텍처 요구사항을 명시적으로 유지하라.
지원되지 않는 아키텍처를 테스트 실패로 바꾸지 마라.
로컬 장치가 다르다는 이유로 지원되는 아키텍처를 건너뛰지 마라.
피할 수 있는 메모리 부족으로 건너뛰지 않으면서 계약을 검증하는 테스트 형상을 선택하라.
변경의 영향을 받는 어텐션, 행렬 곱셈, 전문가 혼합, 통신, 유틸리티 경로를 다뤄라.
집합 또는 분산 테스트에는 다중 장치 실행 도구를 사용하라.
비교 가능한 백엔드와 배치 구성을 지원하는 통합 하네스를 통해 벤치마크를 측정하라.
하드웨어 수준 프로파일러 시간 측정을 우선하고 사용할 수 없으면 가속기 이벤트를 사용하라.
각 벤치마크 결과를 생성한 시간 측정 메커니즘을 기록하라.
중앙값, 변동, 반복 횟수, 작업 부하 형상, 데이터 타입, 아키텍처, 백엔드를 보고하라.
커널을 비교할 때 참조 검사를 활성화하라.
정확성 검사와 재현 가능한 매개변수 없이 속도를 주장하지 마라.
성능에 민감한 커널을 승인하기 전에 벤치마크와 테스트 근거를 필수로 요구하라.
## 소스나 대상 GPU가 바뀌면 캐시된 커널 다시 빌드하기
로드된 모듈에는 프로세스 내 캐시를, 컴파일된 산출물에는 디스크 캐시를 사용하라.
원본, 플래그, 아키텍처, 매개변수 또는 라이브러리 버전이 바뀌면 캐시된 모듈을 무효화하라.
작업 타입, 매개변수, 원본 해시, 플래그, 대상 아키텍처에서 캐시 식별자를 도출하라.
특수화 및 도구 체인 변형 전반에서 캐시 키를 고유하게 유지하라.
산출물 옆에 호환성 메타데이터를 저장하고 로드하기 전에 검증하라.
동시 프로세스가 공유 산출물을 손상하지 않도록 잠금으로 컴파일을 보호하라.
단일 아키텍처 DSL 출력에는 메타데이터가 있는 하나의 모듈 디렉터리와 특수화별 객체 하나를 저장하라.
DSL 컴파일 대상 또는 활성 장치에서 아키텍처를 도출하라.
컴파일러 패키지 버전이나 커널 원본 해시가 바뀌면 DSL 모듈을 무효화하라.
진단을 위해 캐시를 비활성화할 수 있게 하되 기본적으로 재사용을 활성화하라.
디스패치 매크로나 생성 코드를 사용해 데이터 타입과 블록 크기의 조합 공간을 관리하라.
디스패치 선택을 명시적으로 유지하고 지원되지 않는 조합을 테스트하라.
직접 작성한 원본으로 충분하다면 템플릿화를 추가하지 마라.
오래된 사전 컴파일 패키지가 버전 호환성 검사를 우회하지 못하게 하라.
의도적이고 진단된 혼합 버전 실험에서만 버전 검사를 우회하라.
## 크래시를 재현할 수 있게 커널 실행 전에 API 입력을 로그로 남기기
장치 실패 후에도 충돌을 일으킨 매개변수가 남도록 커널 실행 전에 API 입력을 기록하라.
로깅이 비활성화되면 오버헤드가 없게 유지하라.
호출 이름, 입력과 출력, 비용이 큰 통계를 위한 단계별 수준을 제공하라.
통계와 잘못된 값 검사는 명시적으로 요청한 고세부 진단에만 사용하라.
그래프 캡처 중에는 호환되지 않는 통계 수집을 건너뛰어라.
이벤트 수와 전체 크기로 진단 덤프를 제한하라.
비용이 큰 캡처가 관련 API만 대상으로 하도록 포함 및 제외 필터를 지원하라.
덤프를 환경 간에 이동해야 한다면 이식 가능한 텐서 형식을 선택하라.
전용 쓰기 가능 덤프 디렉터리를 사용하라.
실패를 진단하는 동안에만 상세 컴파일 출력과 디버그 심볼을 활성화하라.
생성된 원본, 빌드 매니페스트, 컴파일된 모듈, 캐시 메타데이터를 함께 조사하라.
충돌을 재현할 때 형상, 데이터 타입, 아키텍처, 플래그, 선택된 백엔드를 기록하라.
프로파일러나 디버거가 원본 매핑을 필요로 할 때 줄 정보를 사용하라.
일반 최적화 설정을 디버그 빌드와 분리하라.
강제된 알고리즘 또는 백엔드 선택을 프로덕션 기본값이 아닌 진단 제어로 취급하라.
결과 재현에 사용한 모든 비기본 제어를 문서화하라.
## 내려받은 산출물을 검증하고 정해 둔 GPU 목록으로 릴리스 빌드하기
오프라인 또는 잠금 환경에서 로컬 산출물이 없으면 반드시 실패하라.
신뢰할 수 있는 미러가 기본 산출물 저장소를 대체할 수 있게 하라.
다운로드한 산출물의 체크섬을 기본적으로 검증하라.
임시 디버그 보조 수단으로만 체크섬 검증을 비활성화하라.
병렬 산출물 다운로드 수를 제한하라.
다운로드를 시도하기 전에 구성된 로컬 원본을 우선하라.
컴파일 플래그와 런처 재정의를 명시적이고 관찰 가능하게 유지하라.
산출물 로더 로깅 제어를 API 호출 로깅 제어와 구분하라.
이벤트 시간 측정을 신뢰할 수 없을 때 하드웨어 전역 타이머를 사용하는 등 자동 튜닝에 안정적인 시간 측정을 사용하라.
통제된 CI 진단을 위해 기밀 컴퓨팅 감지를 재정의할 수 있게 하라.
명시적인 캐시 위치와 호환되는 환경이 있을 때만 자동 튜닝 결과를 유지하라.
현재 스택에서 정지하거나 충돌하는 것으로 알려진 커널을 피하도록 전술 차단 목록을 로드하라.
실험적 라우팅 및 커널 선택 재정의를 문서화된 기본값으로 유지하라.
명시적인 아키텍처 목록을 대상으로 사전 컴파일 패키지를 빌드하라.
하나의 권위 있는 버전 원본에서 패키지 버전 메타데이터를 생성하라.
커널, 장치 지원, 버그 수정에는 하위 호환 버전 증가를 사용하라.
호환되지 않는 API 변경은 아키텍처 버전 경계에만 적용하라.
## 공개 API와 문서를 커널 코드와 맞춰 두기
동일한 커널이 여러 호스트 프레임워크를 지원할 수 있도록 타입 지정 언어 간 ABI를 사용하라.
프레임워크별 텐서 처리를 장치 헤더가 아니라 바인딩에 유지하라.
컴파일과 그래프 캡처에 필요한 경우에만 호스트 프레임워크에 사용자 지정 작업을 등록하라.
Python API, JIT 생성기, 바인딩 내보내기, 사전 컴파일 레지스트리, 패키지 내보내기를 동기화하라.
고급 작업 공간 또는 계획 및 실행 설계를 채택하기 전에 가장 단순하게 작동하는 커널 패턴부터 시작하라.
매개변수가 바뀌면 함수 시그니처, 템플릿, 런처, 테스트를 함께 업데이트하라.
근처의 작동하는 예제에서 정립된 스타일, 복잡도, 방어성, 효율성을 배워라.
의도적인 차이와 성능에 중요한 알고리즘 선택을 검토한 대안과 함께 문서화하라.
아키텍처별 동작은 권위 있는 명령어 집합 및 도구 체인 문서를 참조하라.
외부 문서가 오래되었다면 함께 제공되는 의존성 원본을 우선하라.
추적 템플릿과 생성된 벤치마크 정의를 공개 API와 동기화하라.
로깅, 요구사항, FFI 또는 코드 생성 패턴이 바뀌면 인프라 예제와 튜토리얼을 업데이트하라.
사용 중단된 접근 방식을 명확히 표시하거나 현재 지침에서 제외하라.
기여 정책에 따라 유의미한 AI 지원을 공개하라.
원본, 생성 산출물, 캐시, 테스트, 벤치마크, 내보내기, 문서가 일치할 때만 승인하라.
