>

큰 배열 M[159459,159459] 에서 SVD를 수행하고 싶습니다 .

SVP 계산은 (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

    메모리 크기가 중요합니다. 대기 시간이 다음에 해로울 것입니다 :

    주어진 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()

  • 이전 c# - 파일 이름이 Excel 형식인지 알 수있는 방법이 있습니까?
  • 다음 python - django에서 URL을 통해 매개 변수를 전달하는 방법은 무엇입니까?