Rust for Machine Learning - So sánh ngữ nghĩa - Phần 01
Các ứng dụng so sánh mức giống nhau về mặt ngữ nghĩa sử dụng các mô hình học máy thì đã có rất nhiều. Rất tiếc lại chủ yếu được viết bằng Python, có rất rất ít các chương trình tương tự được viết bằng Rust trong khi Rust cũng rất phù hợp và thậm chí còn có nhiều ưu điểm hơn nếu chúng ta nhìn dưới góc độ kiểm soát và tối ưu tài nguyên hệ thống. Cũng cần chia sẻ rằng, trong một vài năm trở lại đây, Rust không chỉ được ứng dụng nhiều trong các mảng lập trình mức hệ thống, lập trình IoT hay các hệ nhúng, các hệ thống hạ tầng chuỗi khối hay tiền mã hóa mà nó cũng bắt đầu được sử dụng khá nhiều trong lĩnh vực học máy, từ việc huấn luyện mô hình cho đến việc xây dựng các hệ thống ứng dụng học máy.
Việc viết các chương trình ứng dụng học máy dùng Rust hoàn toàn không phức tạp và vất vả giống với C++ như mọi người thường nghĩ. Nếu khi viết các chương trình ứng dụng học máy bằng C++, các lập trình viên sẽ rất vất vả trong việc kiểm soát sử dụng bộ nhớ, con trỏ để không bị các lỗi kiểu "segmentation fault" thì dường như việc đó lại được xử lý rất tự nhiên trong Rust, không giống như C++, trình biên dịch rustc sẽ giúp lập trình viên rất nhiều và sẽ đảm bảo một khi đã biên dịch thành công thì sẽ không còn những lỗi liên quan đến quản lý bộ nhớ.
Nếu các lập trình viên còn e dè, lo lắng rằng hệ sinh thái các thư viện hỗ trợ của Rust chưa có nhiều và phong phú bằng Python thì đó chỉ còn là vấn đề thời gian và sẽ rất nhanh thôi. Nếu chúng ta thực sự quan tâm đến tối ưu, tốc độ, an toàn và ổn định thì Rust sẽ là một lựa chọn có tính cam kết trong tương lai.
Hãy xem đoạn mã ví dụ dưới đây, nó thực hiện việc kết nối, tải về một mô hình ngôn ngữ từ HuggingFace. Khá trong sáng và dễ hiểu đúng không?
let access_token = std::env::var("HF_TOKEN").map_err(|e| format!("{e}"))?;
let api = ApiBuilder::new()
.with_progress(true)
.with_token(Some(access_token))
.build()?;
let repo = Repo::with_revision(model_id, RepoType::Model, revision);
let api = api.repo(repo);
let config_file = api.get("config.json")?;
let tokenizer_file = api.get("tokenizer.json")?;
let weights_path = repo.get("model.safetensors")
.await.map_err(|e| candle_core::Error::Msg(e.to_string()))?;
Hay ví dụ một hàm chuẩn hóa ten-xơ (L2-Norm) được viết bằng Rust nhìn cũng rất thân thiện và tao nhã:
pub fn l2_normalize(v: &Tensor)
-> Result<Tensor, Box<dyn std::error::Error>>
{
Ok(v.broadcast_div(&v.sqr()?.sum_keepdim(1)?.sqrt()?)?)
}
Để tìm hiểu thêm về Rust for Machine Learning hãy cùng RustDev Vietnam bắt đầu với video "#0045 - Rust for Machine Learning - So sánh ngữ nghĩa hai đoạn văn - Phần 01" trên kênh Youtube RustDEV Vietnam.
All rights reserved