본문 바로가기

dev_AI_framework

(146)
계산 그래프 행렬 변환 - 실험 코드 구성 import numpy as npimport scipy.sparseimport pandas as pdimport ace_tools as tools# 실험용 계산 그래프 구성# 계산식: z = (x + y)^2# 역전파 시: dz/dx = 2 * (x + y), dz/dy = 2 * (x + y)# 노드 구성:# node 0: x# node 1: y# node 2: add = x + y# node 3: square = (x + y)^2# 1. 인접 행렬 생성 (forward 연결: i → j)adj_matrix = scipy.sparse.lil_matrix((4, 4))adj_matrix[0, 2] = 1 # x → addadj_matrix[1, 2] = 1 # y → addadj_matrix[2, 3..
계산 그래프의 구조적 패턴 인식 + 연산 최적화 컴파일러 개념 **딥러닝 컴파일러(예: XLA, TVM, TorchScript)**들이 실제로 직면하고 해결하려고 하는 핵심적인 도전과제이며, 당신은 그걸 계산 그래프 레벨에서 직접 풀어내려고 하고 있습니다. 🧠 문제 재정의✅ 상황 요약복잡한 함수 (tanh, sigmoid, mse)는 기본 연산자 조합으로 표현 가능하지만 GPU (CUDA)에서는 속도를 위해 전체 함수 단위의 커널을 사용함→ 중간 연산자의 output이 존재하지 않음역전파를 위해선 중간값이 필요한 경우가 많지만,→ 함수가 축약되어 있으면 그 정보가 손실 💡 제안한 해결책: 그래프 구조 패턴 → 고수준 연산 축약 컴파일러“어떤 노드 조합이 특정 함수(tanh, sigmoid, mse)에 해당하는지 인식한 후,이를 하나의 연산 노드로 대체하여 for..
계산 그래프 컴파일러 존재의 필요성 가장 기본적인 연산으로 구성된 계산 그래프, 그 중 사전 정의된 activation_function, loss_function 의 경우 그 형태가 복잡하고 연산의 종류가 다양하다. tanh(x) = (exp(x) - exp(-x)) / (exp(x) + exp(-x)) 🔹 계산 그래프 구조 [divide] / \ [subtract] [add] / \ / \ [exp(x)] [exp(-x)] [exp(x)] [exp(-x)] │ [neg] │ x cuda 연산에서 계산 비용..
역전파를 위한 계산 그래프의 행렬 변환 - 아이디어 구체화 🎯 아이디어의 문제의식과 출발점✅ 문제: 역전파 연산의 비효율성계산 그래프 기반의 역전파는 노드 단위로 수행됨→ 재귀적 순회, 의존성 추적, 조건 분기 등으로 인해 구조가 동적이고 비효율적연산 단위가 작고 분산되어 있음→ CUDA에서는 커널 호출이 많아지고, 각 커널이 작은 계산만 수행하게 되어 GPU 자원 낭비**행렬 연산(CUDA의 강점)**을 잘 활용하지 못함→ 특히 역전파는 non-uniform한 데이터 흐름으로 인해 병렬 최적화 어려움🔍 아이디어의 핵심 구체화1. 계산 그래프 → 행렬 형태로 표현일반 계산 그래프는 트리 또는 DAG로 구성되지만,당신은 이를 명시적으로 행렬로 표현하여 다음을 이끌어내려는 것:✅ 연산 순서의 정렬✅ gradient 흐름의 위치 고정✅ 메모리 상 효율적인 데이터 ..
JAX - 함수의 수학적 객체 관찰, 분석 및 최적화 🔍 JAX vs PyTorch 개념적 차이 요약개념PyTorchJAX (w/ XLA)그래프 유형동적 (define-by-run)정적 (define-then-run via JAXPR)미분연산 중 각 노드에서 추적함수 전체를 미분 함수로 변환연산 최적화연산자 수준의 최적화 (부분적)전체 함수 단위 최적화 (XLA 컴파일)디버깅 편의성높음 (디버깅 쉬움)낮음 (JAXPR이 생소함)성능 최적화 유연성낮음 (JIT 따로 없음)높음 (jit, pmap 등 지원) 🔧 JAX의 기본 개념JAX는 다음 두 가지 아이디어를 결합한 시스템입니다:NumPy처럼 동작하는 함수형 연산 (pure function style)→ jax.numpy를 사용해서 NumPy처럼 코딩하지만 부작용 없는 함수로 구성컴파일러 트랜스폼(tra..
역전파 아이디어 계산 그래프 단축? 💡 현재 역전파 방식의 구조각 노드는 자식 노드를 가지고 있고,연산자 종류에 따라 각각의 자식으로부터 값을 받고,수동으로 재귀적으로 backward 순회를 수행하며,각 노드의 .grad_input, .grad_weight 등이 업데이트됨.🔧 단점순회 비용이 큼 (재귀 호출, 의존성 따라 순서 결정)메모리 상 위치가 불규칙함 (캐시 효율 ↓) 🚀 당신의 아이디어: 고정된 행렬 기반 그래프 표현계산 그래프를 행렬로 표현해서, 역전파도 행렬 곱 또는 인덱싱 연산으로 처리한다면?✅ 장점고정된 메모리 구조 → 메모리 접근 속도 향상 (캐시 친화적)행렬 기반 연산은 GPU에서 병렬화가 용이연산 순서를 동적으로 탐색하지 않아도 됨grad 값의 위치 = 곧 업데이트 대상 → 포인터/참조 이동 최소화 🔬 실현 가..
역전파 사고 흐름 정리 역전파는 **계산 그래프의 루트 노드 (비용 함수 output)**에서 시작된다.해당 값은 최종 loss 값이며, ∂L/∂L = 1 이므로 upstream_gradient = 1.0으로 시작된다.역전파는 노드들의 연산자 종류에 따라 각 노드의 입력값과 가중치에 대해 미분 값을 계산한다.대부분의 노드는 가중치를 가지지 않기 때문에, grad_weight_total = 0.0 그대로 유지된다.오직 입력값과 가중치의 곱(예: multiply)이 있는 노드들만 grad_weight가 실제로 의미 있게 존재하고, 학습 가능한 파라미터로 작용한다. 대부분의 노드들은 학습 대상이 아닌 단지 gradient 전달자, 역전파는 계산 그래프 전체를 따라 체이닝된 연쇄 미분법을 수행하지만, 학습 대상이 되는 건 multip..
backpropagate() 각 연산 별 미분 값 ( delta 연산을 위한 입력값의 변화량에 대한 비용 함수 변화량, 가중치 갱신을 위한 가중치 변화량에 대한 비용함수 Node.backpropagate(upstream_gradient=1.0)이 함수는 backpropagation 중에 각 노드에서 자신의 입력값에 대한 비용 함수 변화량을 계산하고, 이를 자식 노드에게 전파하는 역할을 한다.mean, sum 같은 특수 연산자는 직접 미분하지 않고 자식들에게 균등 분배한다.일반 연산자에 대해서는,저장된 input_value, output, weight_value 등을 기반으로 미분을 계산 grad_input, grad_weight 를 계산grad_weight_total 에 누적 저장grad_input 을 자식 노드들에게 계속 전파 def backpropagate(self, upstream_gradient=1.0):upstream_gradient : 이 노드의 출력이 다음 ..