Kiểm thử hệ thống Machine Learning

Chào mọi người, tôi là Thảo đến từ team AI VTI-VN!
Hôm nay chúng ta sẽ cùng nhau tìm hiểu xem để kiểm thử một hệ thống Machine Learning (ML) thì nên làm những gì nhé!

1. Kiểm thử hệ thống ML liệu có dễ như ăn bánh?

Trong khi các hệ thống phần mềm truyền thống sẽ có các lập trình viên ngồi nghĩ ra rule và lập trình bằng các ngôn ngữ khác nhau như C++, Java, … thì mô hình ML sẽ tự sinh ra các rule sử dụng dữ liệu được cung cấp. Điều này chắc chắn là một điều tốt bởi không phải rule nào lập trình viên cũng tự nghĩ ra được , tuy nhiên nó cũng mặt trái: rule được sinh ra có thể thay đổi theo hướng xấu hoặc tốt, hoặc là bị …BUG mất rồi. Điều này dẫn tới việc kiểm thử và debug một hệ thống ML không hề đơn giản.

2. Kiểm thử hệ thống phần mềm truyền thống

Hai loại kiểm thử phần mềm thông thường bao gồm:

  • Functional Testing: Kiểm tra xem hệ thống đã đảm bảo yêu cầu về chức năng chưa.
    Ví dụ: ấn tắt Windows update mà mãi nó vẫn update thì chứng tỏ chức năng này đã thất bại rồi.
  • Non-functional Testing: Kiểm tra xem hệ thống có đáp ứng yêu cầu của khách hàng hay không.
    Ví dụ: nếu tất cả nhân viên của VTI đều ấn nút “Đăng nhập" vào VMS thì hệ thống không được sập.

2.1 Functional Testing

Thông thường loại kiểm thử này bao gồm:

  • Unit testing: Kiểm tra từng module nhỏ.
  • Integration testing: Kiểm tra một module lớn bao gồm nhiều module nhỏ để đảm bảo khi kết hợp không xảy ra vấn đề gì.
    Tips: Theo nguyên tắc KISS [9], hãy luôn cố gắng bẻ vấn đề thành nhiều module đủ nhỏ và dễ hiểu.
    Trong hình ảnh dưới, nguyên tắc này đã được áp dụng qua việc cố gắng sử dụng hàm nhiều nhất có thể, ví dụ như train_test_split, accuracy_score, confusion_matrix, và classification_report để chuyện kiểm thử và debug dễ dàng hơn nhiều.

  • Regression Testing: Kiểm tra lại toàn bộ chức năng của hệ thống mỗi khi có thay đổi của một hoặc vài chức năng nào đó.
  • Smoke Testing: Chạy một bài test cơ bản với chức năng tối thiểu để xem hệ thống sẵn sàng cho việc test chưa. Ví dụ: Kiểm tra hệ thống bóng đèn, vừa ấn nút xong mà đã thấy khói bốc lên là không cần test nữa.

2.2 Non-functional Testing

  • Loading Testing: Xác định độ chịu tải, SLA của hệ thống
  • Stress Testing: Đánh giá hành vi của hệ thống tại các điều kiện không lường trước được. Ví dụ: Một phần hệ thống đột nhiên bị shutdown thì phản hồi có chấp nhận được không.

2.3 Luồng phát triển hệ thống phần mềm cơ bản

Một số quy ước khi phát triển phần mềm mà các lập trình viên cần tuân thủ:

  • Không merge code nếu chưa chạy test case
  • Luôn viết code test khi commit logic mới
  • Khi fix bug, luôn luôn viết code test để bắt bug, và phòng tránh trường hợp tương tự trong tương lai.

Minh họa luồng phát triển hệ thống phần mềm [4]

3. Hệ thống ML cần kiểm thử những gì?

Những bài test cho hệ thống phần mềm có thể ứng dụng cho hầu hết ML code, tuy nhiên nó vẫn chưa đảm bảo hệ thống ML có thể hoạt động với độ tin cậy cao.

Source: [3]

Vậy thì hệ thống ML có thể tin tưởng được thì cần kiểm tra thêm những gì?

  • Data pipeline testing: Đảm bảo dữ liệu không bị hỏng, đúng định dạng và đúng kiểu dữ liệu, …
  • Model testing: Đảm bảo mô hình đạt hiệu quả (dựa trên các metrics như accuracy, precision, recall,...) như mong muốn, mô hình có nhất quán không,..

3.1 Data pipeline testing

Dữ liệu là một phần không thể thiếu trong hệ thống ML, do đó việc quan trọng là phải duy trì Data pipeline với độ tin cậy cao. Hình dưới đây là ví dụ về một Data pipeline và yếu tố cần cân nhắc ở mỗi bước:

3.2 Model testing

a. Pre-train testing

Loại kiểm thử này dùng để tìm bug trước khi huấn luyện/đánh giá mô hình:

  • Kiểm tra việc rò rỉ dữ liệu (data leakage), ví dụ như dữ liệu trong tập train cũng nằm trong tập validation/test.
  • Kiểm tra việc rò rỉ các trường dữ liệu (feature leakage) - trường dữ liệu mang thông tin của label.
  • Kiểm tra đầu ra của mô hình có shape và miền giá trị đúng như mong muốn.

b. Post-train testing

Phương pháp này để kiểm tra hoạt động của mô hình (model behavior) có như ý muốn ở các tình huống khác nhau hay không.

  • Invariance testing: mô tả những thay đổi của giá trị đầu vào mà không làm thay đôi kết quả dự doán của mô hình.
    Ví dụ: Với bài toán phân loại cảm xúc, hai câu sau nên có cùng một giá trị đầu ra:

    • Bài hát A hay quá!
    • Bài hát B hay quá!
  • Directional expectation test: mô tả những thay đổi của đầu vào sẽ làm thay đổi kết quả dự đoán của mô hình một cách có thể lường trước.
    Ví dụ: Trong bài toán dự đoán giá nhà, có thể đoán trước là nếu diện tích tăng thì giá nhà sẽ tăng.

  • Bias/Fairness: Kiểm tra mô hình có dự đoán công bằng không, ví dụ dự đoán thu nhập của người châu Mỹ chính xác hơn người châu Á, chứng tỏ mô hình đang bị bias.

  • Model output consistency: Cùng một dữ liệu đầu vào, đầu ra của mô hình có bị thay đổi sau nhiều lần chạy khác nhau hay không?

Ngoài ra, chúng ta không được bỏ qua bước đánh giá hiệu quả của mô hình (evaluate model) thông qua các metrics như accuracy, F1-score, Recall, Precision, AUC ROC, … trên tập validation/test.

5. Một Tester cần gì để có thể kiểm thử hệ thống ML?

Tester cần lưu ý một số vấn đề sau khi bắt tay vào kiểm thử một hệ thống ML:

  • Nhận thức đầy đủ các trường hợp đặc biệt, có thể xảy ra đối với một hệ thống ML:
    • Trường hợp mô hình ML cho kết quả tốt nhất / tệ nhất, và kết quả bình thường.
    • Các trường hợp có sự thay đổi trên biểu đồ học tập (learning graph) của mô hình ML.
  • Đối với mỗi giá trị đầu vào thì giá trị đầu ra mong muốn là gì?
  • Tester không nhất thiết phải biết mô hình hoạt động thế nào, coi mô hình ML như một “black-box”, chỉ cần xác thực hành vi của nó thông qua các giá trị đầu vào, đầu ra. Đặc biệt lưu ý các trường hợp đặc biệt.
  • Tester cũng cần thành thạo việc trình bày kết quả đầu ra dưới dạng các bảng biểu thống kê để người xem có thể dễ dàng nắm bắt được tình hình.
  • Cuối cùng, không bắt buộc nhưng nếu tester có thể nhanh chóng nắm bắt được ý tưởng của các thuật toán, cách thức các thuật toán hoạt động trên từng tập dữ liệu khác nhau ra sao, cho ra kết quả như thế nào, … thì việc kiểm thử sẽ dễ dàng hơn rất nhiều!

6. Một số tool hay dùng để kiểm thử và debug

  • pdb để debug Python code
  • pytest là framework hỗ trợ viết code kiểm thử
  • pylint để kiểm tra lỗi cú pháp/logic

6. Tham khảo

[1] Quan Dang - MLOps Vietnam Group member.

[2] Google for Developers. (n.d.). Overview of Debugging ML Models | Machine Learning. [online] Available at: https://developers.google.com/machine-learning/testing-debugging/common/overview

[3] Emmanuel Ameisen, Building Machine Learning Powered Applications: Going from Idea to Product

[4] Jeremy Jordan. (2020). Effective testing for machine learning systems. [online] Available at: https://www.jeremyjordan.me/testing-ml/.

[5] Heck, P. (2019). Software Engineering for Machine Learning Applications. [online] Fontys. Available at: https://fontysblogt.nl/software-engineering-for-machine-learning-applications/

[6] futurice.com. (n.d.). Machine learning vs software engineering differences | Futurice. [online] Available at: https://futurice.com/blog/differences-between-machine-learning-and-software-engineering.

[7] GeeksforGeeks. (2019). Differences between Functional and Non-functional Testing. [online] Available at: https://www.geeksforgeeks.org/differences-between-functional-and-non-functional-testing/.

[8] Yan, E. (2020). How to Test Machine Learning Code and Systems. [online] eugeneyan.com. Available at: https://eugeneyan.com/writing/testing-ml/.

[9] people.apache.org. (n.d.). The Kiss Principle.
[online] Available at: https://people.apache.org/~fhanik/kiss.html

[10] Serokell Software Development Company. (n.d.). Testing Machine Learning Models. [online] Available at: https://serokell.io/blog/machine-learning-testing.

Leave a Reply

Your email address will not be published. Required fields are marked *