7

Tôi đang sử dụng Keras với Tensorflow làm phụ trợ.Keras + Tensorflow và Multiprocessing in Python

Tôi đang cố gắng lưu mô hình trong quy trình chính của mình và sau đó tải/chạy (tức là gọi model.predict) trong một quy trình khác.

Tôi hiện đang thử phương pháp ngây thơ từ tài liệu để lưu/tải mô hình: https://keras.io/getting-started/faq/#how-can-i-save-a-keras-model.
Vì vậy, về cơ bản:

  1. model.save() trong quá trình chính
  2. model = load_model() trong quá trình con
  3. model.predict() trong quá trình con

Tuy nhiên, nó chỉ đơn giản là treo trên load_model gọi.

Tìm kiếm xung quanh Tôi đã phát hiện ra câu trả lời có khả năng liên quan này cho thấy rằng Keras chỉ có thể được sử dụng trong một quá trình: using multiprocessing with theano nhưng không chắc chắn nếu điều này là đúng (dường như không thể tìm thấy nhiều về điều này).

Có cách nào để hoàn thành mục tiêu của tôi không? Mô tả mức cao hoặc ví dụ ngắn được đánh giá cao.

Lưu ý: Tôi đã thử các cách tiếp cận dọc theo đường truyền biểu đồ cho quy trình nhưng không thành công vì có vẻ như biểu đồ tensorflow không thể chọn được (bài đăng SO liên quan ở đây: Tensorflow: Passing a session to a python multiprocess). Nếu có thực sự là một cách để vượt qua các đồ thị/mô hình tensorflow cho quá trình con sau đó tôi mở cho điều đó là tốt.

Cảm ơn!

Trả lời

15

Từ kinh nghiệm của tôi - vấn đề nằm trong việc nạp Keras vào một quy trình và sau đó sinh ra một quy trình mới khi keras đã được tải vào môi trường chính của bạn. Nhưng đối với một số ứng dụng (ví dụ: đào tạo một hỗn hợp của các mô hình Keras) nó chỉ đơn giản là tốt hơn để có tất cả những điều này trong một quá trình. Vì vậy, những gì tôi khuyên là sau (một cồng kềnh một chút - nhưng làm việc cho tôi) cách tiếp cận:

  1. không tải KERAS ĐẾN MÔI TRƯỜNG CHỦ CỦA BẠN. Nếu bạn muốn tải Keras/Theano/TensorFlow chỉ làm điều đó trong môi trường chức năng. Ví dụ. không làm điều này:

    import keras 
    
    def training_function(...): 
        ... 
    

    nhưng làm như sau:

    def training_function(...): 
        import keras 
        ... 
    
  2. Run công việc kết nối với mỗi mô hình trong một quá trình riêng biệt: Tôi thường tạo công nhân đó đang làm công việc (ví dụ như đào tạo, điều chỉnh, ghi điểm) và tôi đang chạy chúng trong các quy trình riêng biệt. Điều gì là tốt đẹp về nó mà toàn bộ bộ nhớ được sử dụng bởi quá trình này là hoàn toàn giải phóng khi quá trình của bạn được thực hiện. Điều này giúp bạn tải nhiều vấn đề về bộ nhớ mà bạn thường gặp phải khi bạn đang sử dụng đa xử lý hoặc thậm chí chạy nhiều mô hình trong một quá trình. Vì vậy, điều này có vẻ nhưnhư thế này:

    def _training_worker(train_params): 
        import keras 
        model = obtain_model(train_params) 
        model.fit(train_params) 
        send_message_to_main_process(...) 
    
    def train_new_model(train_params): 
        training_process = multiprocessing.Process(target=_training_worker, args = train_params) 
        training_process.start() 
        get_message_from_training_process(...) 
        training_process.join() 
    

cách tiếp cận khác nhau chỉ đơn giản là chuẩn bị các kịch bản khác nhau cho hành động mô hình khác nhau. Nhưng điều này có thể gây ra lỗi bộ nhớ đặc biệt là khi các mô hình của bạn tiêu thụ bộ nhớ. LƯU Ý vì lý do này, tốt hơn là bạn nên thực hiện tuần tự một cách nghiêm ngặt.

+0

Marcin, cảm ơn bạn rất nhiều vì đã trả lời. Câu hỏi phụ: câu hỏi SO ở trên bắt nguồn từ mong muốn của tôi để song song dự đoán cho một mô hình trên nhiều gpus. Tôi đã hỏi một câu hỏi SO về điều này một chút trước đây mà không có may mắn: http://stackoverflow.com/questions/42409884/keras-tensorflow-prediction-on-multiple-gpus. Anh có phiền không? Cảm ơn bạn trước. Hãy cho tôi biết nếu cần thêm chi tiết. –

+0

Tôi sẽ xem xét. Đây là thứ mà tôi cũng quan tâm - nhưng tôi chưa thực hiện giải pháp như vậy. Tôi đã thực hiện một quy trình giống như deamon đang nhận được một hình ảnh để xử lý bởi một hỗn hợp của các CNNs sâu keras và đây là ví dụ của tôi xuất phát từ đó. –

Các vấn đề liên quan