2016-10-18 22 views
12

Tôi đang lắp một mô hình LDA với nhiều dữ liệu bằng cách sử dụng tính năng tìm hiểu. Có liên quan đang mảnh trông như thế này:Lỗi "Không có dấu cách trên thiết bị" khi lắp mô hình Sklearn

lda = LatentDirichletAllocation(n_topics = n_topics, 
           max_iter = iters, 
           learning_method = 'online', 
           learning_offset = offset, 
           random_state = 0, 
           evaluate_every = 5, 
           n_jobs = 3, 
           verbose = 0) 
lda.fit(X) 

(Tôi đoán các chi tiết chỉ có thể liên quan ở đây là tôi đang sử dụng nhiều công ăn việc làm.)

Sau một thời gian tôi nhận được "Không gian còn lại trên thiết bị "lỗi, mặc dù có rất nhiều không gian trên đĩa và nhiều bộ nhớ trống. Tôi đã thử mã giống nhau nhiều lần, trên hai máy tính khác nhau (trên máy cục bộ của tôi và trên máy chủ từ xa), trước tiên sử dụng python3, sau đó sử dụng python2 và mỗi lần tôi kết thúc với cùng một lỗi.

Nếu tôi chạy cùng một mã trên một mẫu dữ liệu nhỏ hơn thì mọi thứ hoạt động tốt.

Toàn bộ stack trace:

Failed to save <type 'numpy.ndarray'> to .npy file: 
Traceback (most recent call last): 
    File "/home/ubuntu/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/numpy_pickle.py", line 271, in save 
    obj, filename = self._write_array(obj, filename) 
    File "/home/ubuntu/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/numpy_pickle.py", line 231, in _write_array 
    self.np.save(filename, array) 
    File "/home/ubuntu/anaconda2/lib/python2.7/site-packages/numpy/lib/npyio.py", line 491, in save 
    pickle_kwargs=pickle_kwargs) 
    File "/home/ubuntu/anaconda2/lib/python2.7/site-packages/numpy/lib/format.py", line 584, in write_array 
    array.tofile(fp) 
IOError: 275500 requested and 210934 written 


IOErrorTraceback (most recent call last) 
<ipython-input-7-6af7e7c9845f> in <module>() 
     7         n_jobs = 3, 
     8         verbose = 0) 
----> 9 lda.fit(X) 

/home/ubuntu/anaconda2/lib/python2.7/site-packages/sklearn/decomposition/online_lda.pyc in fit(self, X, y) 
    509      for idx_slice in gen_batches(n_samples, batch_size): 
    510       self._em_step(X[idx_slice, :], total_samples=n_samples, 
--> 511          batch_update=False, parallel=parallel) 
    512     else: 
    513      # batch update 

/home/ubuntu/anaconda2/lib/python2.7/site-packages/sklearn/decomposition/online_lda.pyc in _em_step(self, X, total_samples, batch_update, parallel) 
    403   # E-step 
    404   _, suff_stats = self._e_step(X, cal_sstats=True, random_init=True, 
--> 405          parallel=parallel) 
    406 
    407   # M-step 

/home/ubuntu/anaconda2/lib/python2.7/site-packages/sklearn/decomposition/online_lda.pyc in _e_step(self, X, cal_sstats, random_init, parallel) 
    356            self.mean_change_tol, cal_sstats, 
    357            random_state) 
--> 358    for idx_slice in gen_even_slices(X.shape[0], n_jobs)) 
    359 
    360   # merge result 

/home/ubuntu/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.pyc in __call__(self, iterable) 
    808     # consumption. 
    809     self._iterating = False 
--> 810    self.retrieve() 
    811    # Make sure that we get a last message telling us we are done 
    812    elapsed_time = time.time() - self._start_time 

/home/ubuntu/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.pyc in retrieve(self) 
    725     job = self._jobs.pop(0) 
    726    try: 
--> 727     self._output.extend(job.get()) 
    728    except tuple(self.exceptions) as exception: 
    729     # Stop dispatching any new job in the async callback thread 

/home/ubuntu/anaconda2/lib/python2.7/multiprocessing/pool.pyc in get(self, timeout) 
    565    return self._value 
    566   else: 
--> 567    raise self._value 
    568 
    569  def _set(self, i, obj): 

IOError: [Errno 28] No space left on device 
+0

Có thể nó sẽ hoạt động mà không cần đa xử lý ('' 'n_jobs = 1'''). Tôi không chắc chắn, con đường mà scikit-learning đang sử dụng cho một số dữ liệu tạm thời. Phân vùng tmp của bạn lớn đến mức nào? – sascha

+0

Cảm ơn @sascha, tôi sẽ thử chỉ với một quy trình. Nếu 'tmpfs' là phân vùng tmp (tôi nghĩ nó là?) Thì nó là 1.6GB. Đây có phải là vấn đề không? Nếu vậy, có cách giải quyết nào cho vấn đề này không? – machaerus

Trả lời

15

Đã cùng một vấn đề với LatentDirichletAllocation. Dường như, bạn đang hết bộ nhớ dùng chung (/dev/shm khi bạn chạy df -h). Thử đặt biến môi trường JOBLIB_TEMP_FOLDER thành thứ gì đó khác: ví dụ: đến /tmp. Trong trường hợp của tôi, nó đã giải quyết được vấn đề.

Hoặc chỉ tăng kích thước bộ nhớ dùng chung, nếu bạn có các quyền thích hợp cho máy bạn đang đào tạo LDA.

+7

Điều này làm việc cho tôi. Sử dụng iPython trong vùng chứa docker, cố gắng xác thực mô hình như: 'best_knn_clf = KNeighborsClassifier (trọng số = 'khoảng cách', n_neighbors = 4, n_jobs = -1) điểm = cross_val_score (best_knn_clf, X_train_expanded, y_train_expanded, cv = 3, n_jobs = -1, verbose = 3) '. Đã thêm '% env JOBLIB_TEMP_FOLDER =/tmp' vào sổ ghi chép đã thực hiện thủ thuật. –

0

Điều này là do bạn đã đặt n_jobs = 3. Bạn có thể đặt nó thành 1, sau đó bộ nhớ dùng chung sẽ không được sử dụng, mặc dù việc học sẽ mất nhiều thời gian hơn. Bạn có thể chọn để chọn một thư mục cache joblib như trên câu trả lời, nhưng nhớ rằng bộ nhớ cache này có thể nhanh chóng điền vào đĩa của bạn là tốt, tùy thuộc vào tập dữ liệu? và các giao dịch đĩa có thể làm chậm công việc của bạn.

0

Sự cố này xảy ra khi bộ nhớ dùng chung được tiêu thụ và không hoạt động I/O nào được phép. Đây là vấn đề khó chịu xảy ra với hầu hết người dùng Kaggle khi lắp các mô hình học máy hoặc các nhiệm vụ liên quan.

Tôi đã khắc phục sự cố này bằng cách đặt biến JOBLIB_TEMP_FOLDER bằng mã sau.

%env JOBLIB_TEMP_FOLDER=/tmp 
Các vấn đề liên quan