Python ngẫu nhiên giống nhau mọi lúc

Các kết quả có thể lặp lại hoàn toàn không được đảm bảo trên các bản phát hành PyTorch, các cam kết riêng lẻ hoặc các nền tảng khác nhau. Hơn nữa, kết quả có thể không tái tạo được giữa các lần thực thi CPU và GPU, ngay cả khi sử dụng các hạt giống giống hệt nhau

Tuy nhiên, bạn có thể thực hiện một số bước để hạn chế số lượng nguồn của hành vi không xác định đối với một nền tảng, thiết bị và bản phát hành PyTorch cụ thể. Đầu tiên, bạn có thể kiểm soát các nguồn ngẫu nhiên có thể khiến nhiều lần thực thi ứng dụng của bạn hoạt động khác đi. Thứ hai, bạn có thể định cấu hình PyTorch để tránh sử dụng các thuật toán không xác định cho một số thao tác, để nhiều lệnh gọi đến các thao tác đó, với cùng một đầu vào, sẽ tạo ra cùng một kết quả

Cảnh báo

Các hoạt động xác định thường chậm hơn so với các hoạt động không xác định, vì vậy hiệu suất chạy một lần có thể giảm đối với mô hình của bạn. Tuy nhiên, thuyết tất định có thể tiết kiệm thời gian trong quá trình phát triển bằng cách tạo điều kiện thuận lợi cho thử nghiệm, gỡ lỗi và kiểm tra hồi quy

Kiểm soát các nguồn ngẫu nhiên¶

Trình tạo số ngẫu nhiên PyTorch¶

Bạn có thể sử dụng

import random
random.seed[0]
7 để tạo RNG cho tất cả các thiết bị [cả CPU và CUDA]

import torch
torch.manual_seed[0]

Một số hoạt động của PyTorch có thể sử dụng số ngẫu nhiên trong nội bộ.

import random
random.seed[0]
8 làm điều này, ví dụ. Do đó, việc gọi nó nhiều lần liên tiếp với cùng một đối số đầu vào có thể cho các kết quả khác nhau. Tuy nhiên, miễn là
import random
random.seed[0]
7 được đặt thành một hằng số khi bắt đầu ứng dụng và tất cả các nguồn không xác định khác đã bị loại bỏ, cùng một chuỗi số ngẫu nhiên sẽ được tạo mỗi khi ứng dụng được chạy trong cùng một môi trường

Cũng có thể thu được kết quả giống hệt nhau từ một thao tác sử dụng các số ngẫu nhiên bằng cách đặt

import random
random.seed[0]
7 thành cùng một giá trị giữa các lần gọi tiếp theo

Trăn¶

Đối với các toán tử tùy chỉnh, bạn cũng có thể cần đặt hạt giống python

import random
random.seed[0]

Trình tạo số ngẫu nhiên trong các thư viện khác¶

Nếu bạn hoặc bất kỳ thư viện nào bạn đang sử dụng phụ thuộc vào NumPy, bạn có thể khởi tạo NumPy RNG toàn cầu bằng

import numpy as np
np.random.seed[0]

Tuy nhiên, một số ứng dụng và thư viện có thể sử dụng các đối tượng Trình tạo ngẫu nhiên NumPy, không phải RNG toàn cầu [https. // numpy. org/doc/ổn định/tham chiếu/ngẫu nhiên/trình tạo. html] và những thứ đó cũng sẽ cần được tạo một cách nhất quán

Nếu bạn đang sử dụng bất kỳ thư viện nào khác sử dụng trình tạo số ngẫu nhiên, hãy tham khảo tài liệu dành cho các thư viện đó để xem cách đặt hạt giống nhất quán cho chúng

Điểm chuẩn tích chập CUDA¶

Thư viện cuDNN, được sử dụng bởi các hoạt động tích chập CUDA, có thể là một nguồn không xác định qua nhiều lần thực thi ứng dụng. Khi một tích chập cuDNN được gọi với một tập tham số kích thước mới, một tính năng tùy chọn có thể chạy nhiều thuật toán tích chập, so sánh chúng để tìm ra thuật toán nhanh nhất. Sau đó, thuật toán nhanh nhất sẽ được sử dụng một cách nhất quán trong suốt phần còn lại của quy trình cho bộ tham số kích thước tương ứng. Do nhiễu điểm chuẩn và phần cứng khác nhau, điểm chuẩn có thể chọn các thuật toán khác nhau trong các lần chạy tiếp theo, ngay cả trên cùng một máy

Vô hiệu hóa tính năng đo điểm chuẩn với

import random
random.seed[0]
0 khiến cuDNN chọn một thuật toán một cách dứt khoát, có thể phải trả giá bằng hiệu suất giảm

Tuy nhiên, nếu bạn không cần khả năng lặp lại qua nhiều lần thực thi ứng dụng của mình, thì hiệu suất có thể cải thiện nếu tính năng đo điểm chuẩn được bật với

import random
random.seed[0]
1

Lưu ý rằng cài đặt này khác với cài đặt

import random
random.seed[0]
2 được thảo luận bên dưới

Tránh các thuật toán không xác định¶

import random
random.seed[0]
3 cho phép bạn định cấu hình PyTorch để sử dụng thuật toán xác định thay vì thuật toán không xác định nếu có và đưa ra lỗi nếu một thao tác được biết là không xác định [và không có giải pháp thay thế xác định]

Vui lòng kiểm tra tài liệu về

import random
random.seed[0]
3 để biết danh sách đầy đủ các hoạt động bị ảnh hưởng. Nếu một hoạt động không hoạt động chính xác theo tài liệu hoặc nếu bạn cần triển khai xác định một hoạt động không có, vui lòng gửi vấn đề. https. //github. com/pytorch/pytorch/issues?q=label. %22mô-đun. %20quyết định%22

Ví dụ: chạy triển khai CUDA không xác định của

import random
random.seed[0]
5 sẽ gây ra lỗi

>>> import torch
>>> torch.use_deterministic_algorithms[True]
>>> torch.randn[2, 2].cuda[].index_add_[0, torch.tensor[[0, 1]], torch.randn[2, 2]]
Traceback [most recent call last]:
File "", line 1, in 
RuntimeError: index_add_cuda_ does not have a deterministic implementation, but you set
'torch.use_deterministic_algorithms[True]'. ...

Khi

import random
random.seed[0]
6 được gọi với các thang đo CUDA mật độ thưa thớt, thuật toán này thường sử dụng thuật toán không xác định, nhưng khi cờ xác định được bật, triển khai xác định thay thế của nó sẽ được sử dụng

import random
random.seed[0]
1

Hơn nữa, nếu bạn đang sử dụng tenxơ CUDA và phiên bản CUDA của bạn là 10. 2 trở lên, bạn nên đặt biến môi trường CUBLAS_WORKSPACE_CONFIG theo tài liệu CUDA. https. // tài liệu. nvidia. com/cuda/cublas/index. html#cublasApi_reproductibility

Định thức tích chập CUDA¶

Trong khi vô hiệu hóa điểm chuẩn tích chập CUDA [đã thảo luận ở trên] đảm bảo rằng CUDA chọn cùng một thuật toán mỗi khi ứng dụng được chạy, bản thân thuật toán đó có thể không xác định, trừ khi bạn đặt

import random
random.seed[0]
7 hoặc
import random
random.seed[0]
8. Cài đặt thứ hai chỉ kiểm soát hành vi này, không giống như
import random
random.seed[0]
3, cài đặt này sẽ khiến các hoạt động PyTorch khác cũng hoạt động một cách xác định

CUDA RNN và LSTM¶

Trong một số phiên bản của mạng CUDA, RNN và LSTM có thể có hành vi không xác định. Xem

import numpy as np
np.random.seed[0]
0 và
import numpy as np
np.random.seed[0]
1 để biết chi tiết và cách giải quyết

Python ngẫu nhiên có thực sự ngẫu nhiên không?

Hầu hết dữ liệu ngẫu nhiên được tạo bằng Python không hoàn toàn ngẫu nhiên theo nghĩa khoa học của từ này . Thay vào đó, nó là giả ngẫu nhiên. được tạo bằng trình tạo số giả ngẫu nhiên [PRNG], về cơ bản là bất kỳ thuật toán nào để tạo dữ liệu có vẻ ngẫu nhiên nhưng vẫn có thể tái tạo.

Tại sao số ngẫu nhiên không thực sự ngẫu nhiên?

Tạo số giả ngẫu nhiên. Các số ngẫu nhiên do phần mềm tạo chỉ là giả ngẫu nhiên. Chúng không thực sự ngẫu nhiên vì máy tính sử dụng thuật toán dựa trên phân phối và không an toàn vì chúng dựa trên các thuật toán xác định, có thể dự đoán được .

Chủ Đề