홈>
큰 배열
M[159459,159459]
에서 SVD를 수행하고 싶습니다
.
(159459,159459)
모양의 입력 행렬에 의존하기 때문에
.
이 여기 에서 목표를 달성하지 못했습니다
. >사용하려고했습니다 :
-
scipy.linalg.svd
-
scipy.linalg.svd(check_finite=False)
- 드라이버를
lapack_driver='gesvd
로 변경 -
numpy.linalg.svd
그러나 항상 MemoryError가 발생합니다. 마지막으로 Procrustes 분석을 수행하고 싶기 때문에 전체 SVD를 계산하려고합니다.M이 현재 가지고있는 행렬 인 경우
M = USV'
가 필요합니다.
import numpy as np
from scipy import linalg
#M = np.load("M.npy")
M = np.random.rand(159459,159459)
U, s, Vh = linalg.svd(M, check_finite=False, lapack_driver='gesvd)
모든 것이 실패합니다.
시스템 정보 :
$ cat /proc/meminfo
MemTotal: 527842404 kB
MemFree: 523406068 kB
MemAvailable: 521659112 kB
- 답변 # 1
관련 질문
- python : 파이썬에서 선형 대수(부분) 풀기
- python : TypeError: matplotlib에서 플롯의 정수 스칼라 배열만 스칼라 인덱스로 변환할 수 있습니다.
- "ValueError: Shape Mismatch"로 이어지는 Python 오류 캐스케이드
- python : 이 작업을 더 빠르게 수행할 수 있는 방법이 있습니까?
- python : 값/중첩 np.where 알 수 없는 깊이를 기반으로 df의 여러 열을 단일 열로 통합
- python : 다른 dtypes로 값 곱하기
- python : 2D를 3D로 변형하면 예상하지 못한 출력이 생성됨
- python : np.squeeze는 axis=-1을 의미합니까?
- python : 루프가 없는 고르지 않은 반복의 경우 np.repeat()와 동일
- python : 짝수가 아닌 간격으로 데이터 세트에서 선택한 라인을 읽는 방법은 무엇입니까?
메모리 크기가 중요합니다. 대기 시간이 다음에 해로울 것입니다 :
주어진
mM.shape == [159459, 159459]
,위지 위즈 기본적으로
mM.dtype
필요한 사항은 다음과 같습니다.
float(64)
203.42 [GB]
의 원본에 대한 및 플러스mM[159459, 159459]
계산 된203.42 [GB]
에 대한 및 플러스mU[159459, 159459]
계산 된203.42 [GB]
에 대한Vh[159459, 159459]
계산 된0.0013 [GB]
에 대한vS[159459]
에서 2 (및 4 이하)의 리니어 전용 다운 스케일링을 시도하여 가장 저렴한 단계float64
로 또는 심지어float32
게임 체인저가 아니며float16
에 의해 엄중히 처벌됩니다. 비 효율성 (내부적으로numpy
까지 역변환을 수행하지 않는 경우) 다시-내 자신의 시도는 이것에 너무 피가 났으며, 결과적으로 불만족스러운 부분을 공유하여 가장 낮은 교수형 과일로 시작하려고 할 때 내 자신의 오류가 반복되는 것을 피합니다 ...)귀하의 분석이 벡터
float64
와 함께 작동 할 수있는 경우 , 오직vS
플래그는.svd( ..., compute_uv = False, ... )
에 대한 공간을 만들지 않습니다.~ 1/2 [TB]
의 인스턴스를 반환하지 않으므로 (예 : 공간을 예약하지 않음) RAM 할당 및mU
.이러한 경우에도 SLOC가보고 된
Vh
에서와 같이 살아남는 것을 의미하지는 않습니다. RAM 시스템. 와이즈 비즈 처리는 코딩 범위를 벗어난 내부 작업 리소스를 할당합니다 (확실히0.5 TB
를 리팩토링하고 다시 디자인하지 않는 한) 확실하지 않은 경우 매우 가능성이 높은 것으로 간주됩니다) 및 구성 제어. 따라서scipy.linalg.svd()
를 테스트 할 때도 경고하십시오. 처리 모드,scipy.linalg
내부적으로 필요한 데이터 구조를 내부 RAM에 할당하지 못하면 현재 RAM에 맞지 않는 경우 여전히 오류가 발생할 수 있습니다.이것은
compute_uv = False
를 사용하더라도 : 원본.svd()
의 RAM 내 표현을 오프로드하는 데 유용한 트릭입니다. (처음 필요한numpy.memmap()
의 일부를 피함 호스트 RAM 사용을 차단하거나 차단하지 못하지만)이 트릭을 사용하려면 비용을 지불해야합니다.소규모의
가장 좋은 결과는 고급mM
에서 내 실험 매트릭스 처리 및 ML 최적화에 사용되는 -s,203.4 [GB]
에 대한 수율 스마트 캐싱에도 불구하고.memmap
때문에 처리 속도가 느려짐 인스턴스는 디스크 I/O에 따라 다릅니다.1E4 ~ 1E6
를 사용하는 것입니다. 대기 시간이 짧은 고속 액세스 버스 M.2 또는 PCIx16의 컴퓨팅 장치에서 바로 호스팅되는 크기의 SSD 전용 저장 장치 마지막 경험은 여기에서 아직 듣고 싶지 않을 수도 있습니다 :멀티 TB 컴퓨팅 장치를 사용하는 더 큰 호스트 기반 RAM을 사용하는 것이 더 안전합니다. 성능 저하 및 추가 비용이 프로젝트 예산 내에있는 경우 위의 제안 된 단계를 테스트하면 도움이됩니다. 그렇지 않은 경우 Alma Mater 또는 프로젝트에서 가장 가까운 연구 센터에서 HPC 센터를 사용하십시오. 이러한 멀티 TB 컴퓨팅 장치는 일반적으로 사용됩니다.
numpy.memmap()