왜 numpy ndarray에는 .device='cpu'가 있을까?

오늘 업무 중에 우연히 발견했는데, torch.Tensor뿐만 아니라 numpy ndarray도 .device property가 존재하고 "cpu"를 반환한다.

엥?

넘파이는 당연히 CPU에서 연산을 진행하는 것으로 알고 있었기에 뭘까, 다른 디바이스도 지원이 된다는 건가? 하는 의문을 가져 찾아보고 그 결과물을 정리해본다.

Python array APIs

NumPy, Tensorflow, PyTorch, Dask, JAX, CuPy, MXNet, Xarray 등 텐서를 다루는 파이썬 라이브러리는 꽤 많은 편이다. 그리고 딥러닝 연구자라면 경험을 통해 알겠지만 NumPy/PyTorch와 같이 매우 자주 쓰이는 두 라이브러리에 대해서도 인터페이스는 여러 곳에서 다른 편이다. Python array API는 이러한 문제(?)를 해결하고자 하는 사람들이 모여 만든 컨소시움에서 발표한 표준으로 보인다. 아래는 관련 링크들이다.

Python array API standard — Python array API standard 2024.12 documentation
GitHub - data-apis/array-api: RFC document, tooling and other content related to the array API standard
RFC document, tooling and other content related to the array API standard - data-apis/array-api

핵심 컨트리뷰터를 확인하니 Quansight는 오픈소스 중심의 엔지니어링 회사 주도로 프로젝트가 이어지는 듯하다. https://labs.quansight.org/projects 이 링크에서 conda-forge, numpy 등 다양한 프로젝트에서 작거나 큰 기여를 하고 있다는 사실을 확인할 수 있다. 아래는 컨소시움 구성을 소개하는 글이다.

Announcing the Consortium for Python Data API Standards
An initiative to develop API standards for n-dimensional arrays and dataframes

NEP 56

실제로 numpy에서는 python array api를 numpy 2.0부터 거의 완전히 도입한 것으로 보인다. .device property가 생긴 것도 이 시점이고, 아래 릴리즈 노트에서도 확인 가능하다.

NumPy 2.0.0 Release Notes — NumPy v2.4.dev0 Manual

관련해서 NEP(PEP와 같이 Numpy Enhancement Proposal의 약자로 보임) 56이 제안되고 검토되고 구현되었음을 확인이 가능하다. 이 글을 쓰기 이전까지 PEP/REP(ROS Enhancement Proposal)이 있던 건 알았는데 NEP도 있는 건 몰랐어서 신기했다. 최근의 개발 경험에서 이런 Proposal 문서 기반 방법이 대규모 프로젝트 관리와 협업, (추가적으로 바이브코딩) 에 굉장히 유용함을 느끼고 있는데 이런저런 곳에서 쓰이는구나 싶었다.

NEP 56 — Array API standard support in NumPy’s main namespace — NumPy Enhancement Proposals

그래서 device가 있는 이유? 그냥 array api와 맞추기 위해서다. 넘파이에 device=cpu 외의 값은 없다. 넘파이는 알던 대로 cpu 위에서만 작동한다.

마무리

사실 취지는 좋은 프로젝트지만 당연히 라이브러리별로 목표하는 바가 다르고 최적의 설계가 다를 것이기에 어디까지 적용이 가능할지는 모르겠긴 하다. 이런 종류의 proposal들은 proposal만 하면 아무것도 이뤄지지 않고 직접 구현까지 해줘야 실제로 변화가 일어나기도 하고. 뭐 그래도 멋있는 프로젝트고 멋있는 스탠다드라고 생각한다. 그나저나 Quansight 같은 회사는 뭐 가지고 돈 버나 궁금하긴 하다.

아, 그리고 이러한 array에 대한 standard가 type hint와도 굉장히 연관이 클 것이다. 넘파이나 토치 타이핑에 마땅한 솔루션이 없나 궁금해서 잠깐 찾아봤을 때는 마음에 드는 방법이 그닥 없었는데(typing.Annotated로 dtype/shape를 명시하는 방법 등이 있었으나 type checker에서 지원이 되는지와 같은 여부가 불확실했다.), 이러한 스펙이 널리 보편화될수록 이런 스펙을 정의하는 것에도 큰 도움이 될 것이라 생각한다.