Я получаю одинаковые результаты как в Джулии, так и в Python. Разложение в единственном значении на графическом процессоре медленнее, чем на процессоре для массивов Float64. (Массивы float32 ведут себя так, как можно ожидать, с быстрее графического процессора.) -Верд ">
import time
import torch
from torch.linalg import svd
f64 = torch.double
f32 = torch.float
cpu = torch.device("cpu")
gpu = torch.device("cuda")
# X = torch.rand(5_000, 10_000, dtype=f32)
X = torch.rand(5_000, 10_000, dtype=f64)
X_cpu = X.to(cpu)
X_gpu = X.to(gpu)
print(X_cpu.type())
# Warmup
U, Sig, Vt = svd(X_cpu, full_matrices = True)
# Timed run (CPU)
t1 = time.perf_counter()
U, Sig, Vt = svd(X_cpu, full_matrices = True)
t2 = time.perf_counter()
print(U.type())
print(X_cpu.type())
# Warmup
U, Sig, Vt = svd(X_gpu, full_matrices = True)
# Timed run (GPU)
t3 = time.perf_counter()
U, Sig, Vt = svd(X_gpu, full_matrices = True)
t4 = time.perf_counter()
print(U.type())
print(f"Time CPU (s): {t2-t1}")
print(f"Time GPU (s): {t4-t3}")
< /code>
Для приведенного выше массива float64 I Get: < /p>
Time CPU (s): 14.52491476599971
Time GPU (s): 56.79755901500175
< /code>
Если я использую массив Float32 вместо этого, я получаю гораздо более разумный вид: < /p>
Time CPU (s): 9.301500292000128
Time GPU (s): 6.969021153003268
< /code>
Хотя все же немного удивительно, что использование графического процессора ускоряет вещи только на пару секунд. < /p>
Код Юлии дает аналогичные результаты: < /p>
using LinearAlgebra
using Flux
using CUDA
using cuDNN
X = rand(5_000, 10_000)
println("typeof(X): $(typeof(X))")
# Warmup
U, Sig, V = LinearAlgebra.svd(X)
# Timed run
t1 = time_ns()
U, Sig, V = LinearAlgebra.svd(X)
t2 = time_ns()
println("typeof(U): $(typeof(U))")
X_gpu = X |> gpu |> f64
println("typeof(X_gpu): $(typeof(X_gpu))")
# Warmup
U, Sig, V = CUDA.svd!(X_gpu)
# Timed run
t3 = time_ns()
U, Sig, V = CUDA.svd!(X_gpu)
t4 = time_ns()
println("typeof(U): $(typeof(U))")
println("Time CPU (s): $((t2-t1)/1e9)")
println("Time GPU (s): $((t4-t3)/1e9)")
< /code>
Для этого массива float64 GPU снова занимает гораздо больше времени, чем процессор: < /p>
Time CPU (s): 28.641290506
Time GPU (s): 57.069009417
< /code>
Тем не менее, переход на Float32 снова дает разумный результат: < /p>
Time CPU (s): 15.096364932
Time GPU (s): 7.283513658
< /code>
Два вопроса: < /p>
[list]
[*] Почему массивы Float64 так плохо работают на GPU? Я использую графический процессор серии NVIDIA 40, если это актуально. (Особенно для массивов Float64, но ускорение SVD для массивов Float32 также было бы хорошим.) Одним из возможных способов будет изменение того, как выполняется SVD. Я проверил, и, похоже, нет никаких дополнительных аргументов, доступных для функции SVD CUDA.JL. Я попытался установить full_matrices = false
для функции SVD от Pytorch, но я получил те же результаты.
[/list]
Я получаю одинаковые результаты как в Джулии, так и в Python. Разложение в единственном значении на графическом процессоре медленнее, чем на процессоре для массивов Float64. (Массивы float32 ведут себя так, как можно ожидать, с быстрее графического процессора.) -Верд ">[code]import time import torch from torch.linalg import svd
f64 = torch.double f32 = torch.float
cpu = torch.device("cpu") gpu = torch.device("cuda")
# X = torch.rand(5_000, 10_000, dtype=f32) X = torch.rand(5_000, 10_000, dtype=f64)
X_cpu = X.to(cpu) X_gpu = X.to(gpu)
print(X_cpu.type()) # Warmup U, Sig, Vt = svd(X_cpu, full_matrices = True) # Timed run (CPU) t1 = time.perf_counter() U, Sig, Vt = svd(X_cpu, full_matrices = True) t2 = time.perf_counter() print(U.type())
print(X_cpu.type()) # Warmup U, Sig, Vt = svd(X_gpu, full_matrices = True) # Timed run (GPU) t3 = time.perf_counter() U, Sig, Vt = svd(X_gpu, full_matrices = True) t4 = time.perf_counter() print(U.type())
print(f"Time CPU (s): {t2-t1}") print(f"Time GPU (s): {t4-t3}") < /code> Для приведенного выше массива float64 I Get: < /p> Time CPU (s): 14.52491476599971 Time GPU (s): 56.79755901500175 < /code> Если я использую массив Float32 вместо этого, я получаю гораздо более разумный вид: < /p> Time CPU (s): 9.301500292000128 Time GPU (s): 6.969021153003268 < /code> Хотя все же немного удивительно, что использование графического процессора ускоряет вещи только на пару секунд. < /p> Код Юлии дает аналогичные результаты: < /p> using LinearAlgebra using Flux using CUDA using cuDNN
X = rand(5_000, 10_000) println("typeof(X): $(typeof(X))") # Warmup U, Sig, V = LinearAlgebra.svd(X) # Timed run t1 = time_ns() U, Sig, V = LinearAlgebra.svd(X) t2 = time_ns()
println("typeof(U): $(typeof(U))")
X_gpu = X |> gpu |> f64 println("typeof(X_gpu): $(typeof(X_gpu))")
# Warmup U, Sig, V = CUDA.svd!(X_gpu) # Timed run t3 = time_ns() U, Sig, V = CUDA.svd!(X_gpu) t4 = time_ns() println("typeof(U): $(typeof(U))")
println("Time CPU (s): $((t2-t1)/1e9)") println("Time GPU (s): $((t4-t3)/1e9)") < /code> Для этого массива float64 GPU снова занимает гораздо больше времени, чем процессор: < /p> Time CPU (s): 28.641290506 Time GPU (s): 57.069009417 < /code> Тем не менее, переход на Float32 снова дает разумный результат: < /p> Time CPU (s): 15.096364932 Time GPU (s): 7.283513658 < /code> Два вопроса: < /p> [list] [*] Почему массивы Float64 так плохо работают на GPU? Я использую графический процессор серии NVIDIA 40, если это актуально. (Особенно для массивов Float64, но ускорение SVD для массивов Float32 также было бы хорошим.) Одним из возможных способов будет изменение того, как выполняется SVD. Я проверил, и, похоже, нет никаких дополнительных аргументов, доступных для функции SVD CUDA.JL. Я попытался установить full_matrices = false [/code] для функции SVD от Pytorch, но я получил те же результаты. [/list]
Я получаю одинаковые результаты как в Джулии, так и в Python. Разложение в единственном значении на графическом процессоре медленнее, чем на процессоре для массивов Float64. (Массивы float32 ведут себя так, как можно ожидать, с быстрее графического...
Я получаю одинаковые результаты как в Джулии, так и в Python. Разложение в единственном значении на графическом процессоре медленнее, чем на процессоре для массивов Float64. (Массивы float32 ведут себя так, как можно ожидать, с быстрее графического...
Я получаю одинаковые результаты как в Джулии, так и в Python. Разложение в единственном значении на графическом процессоре медленнее, чем на процессоре для массивов Float64. (Массивы float32 ведут себя так, как можно ожидать, с быстрее графического...
Я пытался настроить тензорный поток для работы с моим графическим процессором (GTX 1070). Я установил последние версии драйверов NVIDIA 546.29-desktop-win10-win11-64bit-international-dch-whql.exe
Вывод из nvidia-sim...
Я пытался настроить тензорный поток для работы с моим графическим процессором (GTX 1070). Я установил последние версии драйверов NVIDIA 546.29-desktop-win10-win11-64bit-international-dch-whql.exe
Вывод из nvidia-sim...