[GPU trong AI] Bài 3: Hướng dẫn sử dụng RAPIDS cho xử lý dữ liệu
Trong bài trước, chúng ta đã cùng nhau tìm hiểu về việc sử dụng RAPIDS trong việc xử lý và phân tích dữ liệu bằng GPU. Trong bài viết này, mình sẽ hướng dẫn các bạn cách sử dụng thư viện cuDF, một phần của RAPIDS, để tối ưu hóa quy trình xử lý dữ liệu.
cuDF là gì?
cuDF, hay còn gọi là cuda dataframe, là một thư viện giúp bạn xử lý dữ liệu bằng CUDA. Điều đặc biệt là syntax của cuDF giống hệt với syntax của pandas, nhưng hiệu suất của nó lại nhanh gấp 10 đến 400 lần so với pandas thông thường.
Cách hoạt động của cuDF
Khi bạn gọi cudf.pandas, thực tế là bạn không đang import pandas theo cách thông thường, mà đang sử dụng một proxy module (module thay thế). Module này giả lập pandas, cho phép bạn sử dụng sức mạnh của GPU để xử lý dữ liệu mà vẫn giữ nguyên cú pháp của pandas.
- Khi bạn load cudf.pandas, nó sẽ giả lập (spoof) module của pandas, có nghĩa là khi bạn gọi pandas, thực tế bạn đang sử dụng cudf.pandas.
- Mọi code hoặc thư viện bên thứ ba sử dụng pandas đều sẽ được thực thi thông qua cudf.pandas.
Ví dụ sử dụng cuDF
Dưới đây là một ví dụ dưới dạng mã Python:
python
%load_ext cudf.pandas
import pandas as pd
import seaborn as sns
df = pd.DataFrame({
'A': [1, 2, 3, 4, 5],
'B': [10, 20, 30, 40, 50]
})
df['C'] = df['A'] + df['B']
print(df)
sns.barplot(x='A', y='B', data=df)
Trong đoạn mã này, phép tính df['A'] + df['B']
sẽ được thực hiện trên GPU thông qua cudf.pandas. Hơn nữa, việc sử dụng seaborn (một thư viện bên thứ ba sử dụng pandas) cũng sẽ được thực thi trên GPU.
Thư viện bên thứ ba hỗ trợ cuDF
- Khi bạn gọi các hàm của pandas, cuDF sẽ thay thế nếu hàm tương ứng có trong cuDF.
- Nếu không có hàm tương ứng trong cuDF, dữ liệu sẽ tự động được copy về CPU để sử dụng phiên bản gốc của pandas. Sau khi xử lý, dữ liệu có thể được copy trở lại GPU nếu cần thiết hoặc in trực tiếp kết quả.
Cách sử dụng cuDF trong Notebook
Bạn có thể sử dụng cuDF trên Jupyter Notebook theo cú pháp:
%load_ext cudf.pandas
import pandas as pd
Cách sử dụng cuDF trên Local
Trên môi trường local, bạn có thể chạy mã như sau:
python
import pandas as pd
df = pd.DataFrame({'a': [0, 1, 2], 'b': [3, 4, 3]})
df.min(axis=1)
out = df.groupby('a').filter(
lambda group: len(group) > 1
)
Để chạy command sử dụng cudf.pandas, bạn có thể gõ:
$ python3 -m cudf.pandas <tên file>.py
Đối với profiling, sử dụng các câu lệnh:
$ python3 -m cudf.pandas --profile <tên file>.py
$ python3 -m cudf.pandas --line-profile <tên file>.py
Lưu ý
Trong đoạn mã demo, DataFrameGroupBy.Filter
chưa được hỗ trợ trên GPU, nên đã tự động chuyển sang sử dụng trên CPU. Ở bài viết tiếp theo, mình sẽ hướng dẫn cách viết các kernel để tối ưu hóa quy trình xử lý dữ liệu trên GPU.
Câu hỏi
Từ các hình ảnh đã trình bày ở trên, tại sao tổng thời gian xử lý không bằng tổng thời gian của CPU và GPU? Hãy cùng thảo luận trong các bài viết sắp tới!
source: viblo