GhostLM: Xây dựng mô hình AI An ninh mạng mã nguồn mở từ con số 0
GhostLM là một mô hình ngôn ngữ chuyên biệt cho an ninh mạng, được xây dựng hoàn toàn từ đầu bằng PyTorch mà không phụ thuộc vào các thư viện có sẵn hay trọng số pretrained. Dự án mã nguồn mở này nhằm chứng minh rằng AI chuyên ngành có thể được phát triển với nguồn lực hạn chế, thực sự hiểu sâu về ngữ cảnh bảo mật.

Điều gì sẽ xảy ra nếu bạn có thể xây dựng mô hình AI của riêng mình — không phải tinh chỉnh mô hình của người khác, không phải bọc một API — mà thực sự xây dựng một transformer từ con số 0 và huấn luyện nó trên dữ liệu an ninh mạng?
Đó chính là điều tôi đã làm. Và tôi đang phát hành nó dưới giấy phép Apache 2.0 để bất kỳ ai cũng có thể sử dụng, cải thiện và phát triển thêm.
Hãy cùng tìm hiểu về GhostLM — một mô hình ngôn ngữ tập trung vào an ninh mạng, mã nguồn mở, được xây dựng hoàn toàn từ đầu bằng PyTorch. Không có trọng số pretrained. Không có các lớp bao đóng (wrapper). Mọi thành phần đều được viết tay.
GitHub: https://github.com/joemunene-by/GhostLM
Tại sao tôi xây dựng GhostLM
Điểm mấu chốt ở đây là các mô hình AI hiện nay: chúng cực kỳ mạnh mẽ, nhưng không được xây dựng cho mục đích bảo mật. Khi bạn hỏi GPT-4 về một lỗ hổng CVE hoặc một thử thách CTF, nó đưa ra một câu trả lời hợp lý — nhưng nó lập luận từ kiến thức chung, không phải từ ngữ cảnh bảo mật chuyên sâu.
Tôi muốn một mô hình thực sự hiểu ngôn ngữ an ninh mạng — các mẫu hình, thuật ngữ và phương pháp luận tấn công. Và tôi muốn tự xây dựng nó, không phải vì tôi nghĩ mình có thể vượt qua kỹ thuật của OpenAI, mà vì cách tốt nhất để hiểu cách hoạt động của một thứ là tự xây dựng nó từ nền tảng.
Mục tiêu của tôi rất đơn giản: tạo ra mô hình ngôn ngữ mã nguồn mở đầu tiên tập trung vào an ninh mạng mà bất kỳ ai cũng có thể chạy, kiểm tra và cải tiến.
GhostLM là gì
GhostLM là một mô hình ngôn ngữ transformer loại decoder-only — cùng họ kiến trúc với GPT-2, GPT-3 và Llama — nhưng được xây dựng hoàn toàn từ đầu. Không có transformers.AutoModel, không có from_pretrained(). Chỉ có tensor PyTorch thô và các phép nhân ma trận.
Mô hình có ba phiên bản:
| Biến thể | Lớp (Layers) | Dim | Tham số (Params) | Trạng thái |
|---|---|---|---|---|
| ghost-tiny | 2 | 256 | ~14.5M | ✅ Đã huấn luyện |
| ghost-small | 6 | 512 | ~55M | 🔄 Đang kế hoạch |
| ghost-medium | 12 | 768 | ~160M | 🔜 Tương lai |
Nó được huấn luyện trên:
- Mô tả lỗ hổng CVE từ cơ sở dữ liệu NVD
- Bài viết CTF (writeups) bao gồm các loại thử thách thực tế
- Các bài báo nghiên cứu an ninh mạng và tóm tắt
Và nó hoàn toàn mã nguồn mở theo giấy phép Apache 2.0.
Kiến trúc
Hãy cùng tôi xem "xây dựng từ đầu" thực sự trông như thế nào.
Causal Self-Attention
Đây là cốt lõi của mọi transformer. Đây là triển khai của GhostLM — không có F.scaled_dot_product_attention, không có ma thuật ẩn:
def forward(self, x):
B, T, C = x.size()
# Combined QKV projection and split
qkv = self.c_qkv(x)
q, k, v = qkv.split(self.n_heads * self.head_dim, dim=-1)
# Reshape to (B, n_heads, T, head_dim)
q = q.view(B, T, self.n_heads, self.head_dim).transpose(1, 2)
k = k.view(B, T, self.n_heads, self.head_dim).transpose(1, 2)
v = v.view(B, T, self.n_heads, self.head_dim).transpose(1, 2)
# Scaled dot-product attention
att = (q @ k.transpose(-2, -1)) * (1.0 / math.sqrt(self.head_dim))
# Apply causal mask (lower triangular)
att = att.masked_fill(self.causal_mask[:, :, :T, :T] == 0, float("-inf"))
# Softmax + dropout + weighted sum
att = F.softmax(att, dim=-1)
y = self.attn_dropout(att) @ v
# Reassemble heads and project back
y = y.transpose(1, 2).contiguous().view(B, T, C)
return self.resid_dropout(self.proj(y))
Mỗi dòng code đều có mục đích cụ thể. Causal mask đảm bảo mô hình chỉ có thể chú ý đến các token trước đó (autoregressive). Trọng số attention được tính toán thủ công với công thức kinh điển QK^T / sqrt(d).
Transformer Block
Khối này xếp chồng các lớp attention và feed-forward với kiến trúc pre-norm:
def forward(self, x):
# Pre-norm + self-attention with residual
x = x + self.attn(self.ln_1(x))
# Pre-norm + feed-forward with residual
x = x + self.ffn(self.ln_2(x))
return x
Tại sao lại dùng pre-norm? Tôi选择了 chuẩn hóa trước (pre-normalization - LayerNorm trước mỗi lớp con) thay vì chuẩn hóa sau (post-norm) vì nó ổn định hơn nhiều khi huấn luyện, đặc biệt là trên các mô hình nhỏ. Gradient chảy sạch hơn qua các kết nối dư (residual connections), và bạn không cần một lịch trình tốc độ học (learning rate schedule) quá cẩn thận.
Weight Tying
Một tối ưu hóa giúp tiết kiệm khoảng 25 triệu tham số: lớp chiếu đầu ra chia sẻ trọng số với lớp nhúng token (token embedding). Thay vì học hai ma trận vocab_size × d_model riêng biệt, chúng ta học một cái và tái sử dụng nó:
self.lm_head.weight = self.token_embedding.weight
Đây là cùng một mẹo mà GPT-2 sử dụng, và nó hoạt động vì nhúng và chiếu đầu về cơ bản đang làm cùng một việc — ánh xạ giữa không gian token và không gian ẩn.
Dữ liệu huấn luyện
Đường ống dữ liệu (data pipeline) là một trong những phần quan trọng nhất của bất kỳ dự án ML nào. Pipeline của GhostLM thu thập từ ba nguồn:
Mô tả CVE từ NVD (Dữ liệu thực)
Tôi truy cập trực tiếp REST API của Cơ sở dữ liệu Lỗ hổng Quốc gia (NVD) — không cần phụ thuộc vào HuggingFace. Các yêu cầu phân trang (paginated requests) với giới hạn tốc độ, phân tích cú pháp phản hồi JSON lồng nhau, trích xuất các mô tả tiếng Anh:
url = "https://services.nvd.nist.gov/rest/json/cves/2.0?resultsPerPage=2000&startIndex=0"
resp = requests.get(url, timeout=30)
for item in resp.json()["vulnerabilities"]:
cve_id = item["cve"]["id"]
description = item["cve"]["descriptions"][0]["value"]
Việc này đã cung cấp cho tôi 9.925 mô tả CVE thực — loại văn bản nói rằng "Một tràn bộ đệm trong thành phần XYZ cho phép kẻ tấn công từ xa thực thi mã tùy ý thông qua đầu vào được tạo ra cẩn thận."
Pipeline hoàn chỉnh
NVD API → 9.925 mô tả CVE (thực)
Giấy tờ tổng hợp → 500 tóm tắt nghiên cứu bảo mật
Bài viết CTF tổng hợp → 500 giải pháp thử thách
─────────────────────────────────────────────────
Tổng cộng: 10.925 bản ghi → ~490.532 token
Huấn luyện: 10.378 | Kiểm định: 547
Pipeline xử lý làm sạch văn bản (chuẩn hóa unicode, xóa khoảng trắng, loại bỏ ký tự không thể in được), tokenization, chia nhỏ (chunking), và chia tập huấn luyện/kiểm định — tất cả trong data/collect.py.
Kết quả huấn luyện
Đây là phần thú vị. Tôi đã huấn luyện ghost-tiny trên một ThinkPad Yoga 11e với chip Celeron N4100 và 4GB RAM. Có, đúng là như vậy.
Tiến trình Loss
| Bước (Steps) | Train Loss | Val Loss | Ghi chú |
|---|---|---|---|
| 0 | 10.84 | 10.04 | Khởi tạo ngẫu nhiên |
| 500 | 7.12 | 6.27 | Các mẫu CVE đầu tiên xuất hiện |
| 1.000 | 5.89 | 5.41 | Bắt đầu hình thành câu |
| 2.000 | 4.63 | 4.58 | Ngữ pháp được cải thiện |
| 3.000 | 3.91 | 3.95 | Từ vựng bảo mật xuất hiện |
| 4.000 | 3.52 | 3.58 | Mô tả tấn công mạch lạc |
| 5.000 | 3.38 | 3.46 | Lưu checkpoint tốt nhất |
Đường cong loss rất khỏe mạnh — tập huấn luyện và tập kiểm định đi sát nhau, chưa có dấu hiệu quá khớp (overfitting).
Tạo văn bản tại 5.000 Bước
Dưới đây là những gì mô hình tạo ra khi được nhắc với "A SQL injection attack works by" (Một cuộc tấn công SQL injection hoạt động bằng cách):
A SQL injection attack works by using the admin_user sequences in the web server. Web Application Firewall Evasion Techniques present a critical defense layer against commercial and model checking. Our model achieves 94% detection rate with transformer-based sequence modeling to identify common vulnerability patterns including buffer overflows.
Nó có hoàn hảo không? Không. Nó bị trộn lẫn các chủ đề (SQL injection → WAF → ngôn ngữ bài báo nghiên cứu). Nhưng nó tạo ra các câu đúng ngữ pháp với thuật ngữ bảo mật thực. Ở mức 5.000 bước trên một mô hình 14.5 triệu tham số chạy trên laptop đời 2018, tôi chấp nhận kết quả này.
Các hạn chế thực tế
- Tính mạch lạc của chủ đề — mô hình nhảy giữa các chủ đề trong quá trình tạo. Nó cần nhiều bước hơn để học cách tập trung vào một chủ đề.
- Ghi nhớ — một số đầu ra được sao chép gần như nguyên văn từ dữ liệu huấn luyện. Dữ liệu đa dạng hơn sẽ giúp ích.
- Kích thước — 14.5M tham số là quá nhỏ. ghost-small (55M) sẽ là một bước nhảy vọt lớn.
- Huấn luyện CPU — ở mức ~1.8s mỗi bước, 10.000 bước mất nhiều giờ. GPU hoặc TPU là cần thiết để huấn luyện nghiêm túc.
Tiếp theo là gì?
Tôi đã đăng ký Google TPU Research Credits để huấn luyện ghost-small trên phần cứng chuyên dụng. Kế hoạch:
- ghost-tiny lên 10.000+ bước — hoàn thành những gì đã bắt đầu
- ghost-small trên TPU/GPU — 55M tham số với sức tính toán thực
- Phát hành trên HuggingFace Hub — trọng số mô hình công cộng để bất kỳ ai tải xuống
- Bản demo trực tiếp trên HuggingFace Spaces — thử GhostLM ngay trên trình duyệt
- Benchmark so với GPT-2 — so sánh khách quan trên các nhiệm vụ an ninh mạng
Tự thử ngay
Toàn bộ dự án là mã nguồn mở. Hãy clone, chạy, "phá vỡ" nó và cải thiện nó:
git clone https://github.com/joemunene-by/GhostLM.git
cd GhostLM
# Cài đặt mọi thứ
make install
# Tải dữ liệu huấn luyện
make data
# Huấn luyện ghost-tiny trên CPU
make train-tiny
# Chat với mô hình đã huấn luyện
make chat
# Chạy web demo
pip install gradio
python demo/app.py
Tôi đang tích cực tìm kiếm người đóng góp. Nếu bạn muốn giúp đỡ về:
- Tìm kiếm tập dữ liệu an ninh mạng mới
- Triển khai Flash Attention hoặc RoPE
- Thêm huấn luyện phân tán (distributed training)
- Viết tài liệu
Hãy xem CONTRIBUTING.md và mở một Pull Request.
Lời kết
Tôi là một sinh viên khoa học máy tính 20 tuổi tại Nairobi, Kenya. Tôi không có quyền truy cập vào các cụm máy tính khổng lồ hay ngân sách phòng thí nghiệm nghiên cứu. Nhưng tôi có sự tò mò, kiên trì và niềm tin rằng AI mã nguồn mở không nên chỉ đến từ các phòng thí nghiệm được tài trợ tốt.
GhostLM là bằng chứng rằng bạn có thể xây dựng điều gì đó có ý nghĩa từ con số 0 với nguồn lực hạn chế. Kiến trúc sạch sẽ, pipeline huấn luyện hoạt động tốt, và mô hình đang học hỏi. Nó sẽ không thay thế GPT-4 — nhưng nó là một nền tảng mà bất kỳ ai cũng có thể xây dựng dựa trên đó.
Nếu bạn thấy điều này thú vị, hãy sao star dự án, thử nó và cho tôi biết suy nghĩ của bạn. Điều tốt nhất của mã nguồn mở là nó trở nên tốt hơn khi có nhiều người tham gia hơn.
GitHub: https://github.com/joemunene-by/GhostLM
Giấy phép: Apache 2.0
Được xây dựng với ❤️ tại Nairobi, Kenya 🇰🇪



