Có thể inference 1 model nhiều lần tại 1 thời điểm không? (pytorch , cpu)
mình có 1 server với 16 core. Tại cùng 1 thời điểm mình có thể nhận được tối đa 8 request để inference model. mình nên áp dụng phương pháp nào để tối ưu giữa memory, cpu usage và tốc độ. Các bạn có thể cho mình xin vài gợi ý được không ạ? Minh cảm ơn rất nhiều.
P/s: Phương án của mình hiện tại là sử dụng multiprocess nhưng có vẻ không hiệu quả. Vì model bị load tối đa 8 lần tại 1 thời điểm (ton kem memory). Liệu có thể load model 1 lần và sử dụng nó để inference nhiều request 1 lần không?
2 ANSWERS
Theo như mình hiểu thì mỗi khi cần inference bạn lại load lại model nên dẫn đến việc tràn bộ nhớ (mỗi request lại load lại model 1 lần => trên máy vật lý tồn tại nhiều version khác nhau của 1 model ) nên chỉ có thể giới hạn số lượng request. Nếu thực sự bạn đang code như vậy thì bạn có thể sửa lại theo một số hướng:
- Chỉ load model 1 lần trong 1 file constructor và load nó sẽ được chạy một lần khi run server và lưu lại ở trên RAM
- Sử dụng ONNX convert model sang dạng pb của Tensorflow và sử dụng Tensorflow Serving để cải thiện tốc độ và tách phần model chạy độc lập với API
- Sử dụng Redis Cache để gom số lượng request lại vào một batch và tiến hành inference 1 lần trên model. Tận dụng sức mạnh tính toán của phép nhân ma trận thay vì tình rời rạc từng request 1.
- Tối giản lại mạng, nếu bạn đang sử dụng một kiến trúc quá lớn thì nên tìm cách cắt giảm số lượng parameters trong tính toán bằng một số kĩ thuật như model prunce, knowledge distiller
- Nâng cấp RAM và GPU cho hệ thống
Ngoài ra nếu thực sự vì một lý do nào đó mà server của bạn chỉ có thể thực hiện được với số lượng request như vậy dù bạn đã thực hiện đúng các cách trên thì bạn có thể tìm hiểu thêm về các kĩ thuật scale và load balance server để adaptive được hệ thống khi có số lượng request quá lớn
Hi vọng sẽ giúp được bạn.