
Dự án này làm gì
Công thức triển khai này cung cấp DeepSeek-V4.1-Flash-1017 từ hai NVIDIA DGX Sparks, mỗi máy có 128 GB bộ nhớ hợp nhất. Công thức sử dụng engine Zig gốc của TensorFold với tính song song tensor trên mỗi Spark một rank, đồng thời cung cấp API tương thích với OpenAI trên cổng 8888.
Thiết lập sử dụng checkpoint EXL3 2.9-bit thử nghiệm Mia-AiLab/DeepSeek-V4.1-Flash-1017-EXL3-EAQ-v1-2.9-bpw. Checkpoint này hỗ trợ cửa sổ ngữ cảnh lớn của mô hình, đầu vào hình ảnh, gọi công cụ, chế độ suy nghĩ tùy chọn và giải mã suy đoán DSpark từ các khối bản nháp của checkpoint.
Repository tự động hóa việc chuẩn bị, xây dựng image Docker, tải checkpoint, tạo rank-cache, thiết lập worker, khởi động máy chủ, kiểm tra nhanh và tắt hệ thống. Spark đầu tiên đóng vai trò head: chạy API, điều phối quá trình thiết lập và khởi động rank 0. Spark thứ hai chạy rank 1.
Kiến trúc và các giới hạn quan trọng
TensorFold chạy họ BertholomusAI dsv41 với tính song song tensor được đặt ở mức hai. Hai rank giao tiếp qua liên kết ConnectX-7 trực tiếp. Head tiếp nhận lưu lượng API, trong khi cả hai Spark giữ khoảng 98 GiB trọng số mô hình trong bộ nhớ.
Checkpoint có dung lượng khoảng 196 GiB và được chia thành 39 shard. Quá trình triển khai cũng yêu cầu hai bảng Engram chưa lượng tử hóa, chiếm khoảng 203 GB. Nên sao chép các bảng Engram vào ổ đĩa cục bộ trên cả hai Spark. Việc đọc chúng qua NFS có thể làm giảm đáng kể hiệu năng prefill và decode vì quá trình decode thực hiện nhiều lần đọc ngẫu nhiên 4 KiB.
Về kỹ thuật, mô hình có thể sử dụng cửa sổ 1,048,576 token, nhưng bộ nhớ khả dụng trên head là giới hạn thực tế. Trên head đang chạy các dịch vụ desktop và phát triển khác, README khuyến nghị giữ CONTEXT ở mức 524288 hoặc thấp hơn, trừ khi giải phóng thêm bộ nhớ.
Yêu cầu phần cứng và phần mềm
- Hai NVIDIA DGX Sparks hoặc hệ thống GB10 tương đương, mỗi máy có 128 GB bộ nhớ hợp nhất.
- Một kết nối QSFP trực tiếp giữa các cổng ConnectX-7.
- Địa chỉ IPv4 trên liên kết trực tiếp, có kết nối hoạt động và GID RoCE v2.
- Cùng giới hạn xung GPU trên cả hai hệ thống. README khuyến nghị kiểm tra xung bằng
nvidia-smi -q -d CLOCKvà sử dụngnvidia-smi -lgc 0,2200khi phù hợp. - SSH dựa trên khóa từ head đến worker.
- Docker với runtime container NVIDIA trên cả hai hệ thống, đồng thời người dùng của bạn thuộc nhóm
docker. git,python3và CLI Hugging Face trên head.- Đủ dung lượng lưu trữ cho checkpoint, các bảng Engram, tệp trọng số rank, image Docker và cache. Với bố trí tiêu chuẩn, head cần khoảng 505 GB còn worker cần khoảng 310 GB.
Liên kết trực tiếp có thể xuất hiện dưới dạng hai thiết bị mạng và hai thiết bị RoCE trên mỗi Spark. Hãy cấu hình cả hai rail bằng các địa chỉ trên liên kết và sử dụng cùng MTU trên cả hai hệ thống.
Chuẩn bị mạng và kết nối SSH
Gán địa chỉ thuộc subnet riêng cho các giao diện ConnectX-7. Ví dụ, README sử dụng các địa chỉ như 192.0.2.1/24 và 192.0.2.2/24. Xác nhận rằng hai hệ thống có thể ping lẫn nhau qua liên kết dự kiến.
Trên head, cài đặt khóa SSH cho worker và xác minh quyền truy cập không tương tác:
ssh-copy-id user@<worker>
ssh -o BatchMode=yes user@<worker> trueĐặt đích SSH của worker và địa chỉ fabric trong tệp cấu hình cục bộ. Worker không cần có bản sao của repository này.
Cấu hình NFS hoặc bộ nhớ cục bộ
Theo mặc định, worker gắn cache Hugging Face của head ở chế độ chỉ đọc qua NFS. Trên head, cài đặt máy chủ NFS và export cache:
sudo apt install nfs-kernel-server
echo "$HOME/.cache/huggingface <worker-CX7-address>(ro,no_subtree_check)" | sudo tee -a /etc/exports
sudo exportfs -raWorker có thể cần trình trợ giúp máy khách NFS của máy chủ, chẳng hạn nfs-common trên Ubuntu. Script chuẩn bị tạo volume Docker NFS chỉ đọc và kiểm tra xem worker có thể nhìn thấy các tệp cần thiết hay không.
Để cách ly tốt hơn hoặc khi NFS không phù hợp, hãy đặt một bản sao cục bộ của cache cần thiết trên mỗi Spark. Đặt HF_CACHE trỏ đến cây thư mục cục bộ, đặt NFS_VOLUME trỏ đến đường dẫn máy chủ tương ứng, để trống HEAD_NFS_SERVER và đặt PREPARE=0. Cache cục bộ phải chứa các tệp nhỏ của checkpoint, vision shard model-00039-of-00039, thư mục model/ được cung cấp, kit, token map và tệp trọng số rank tương ứng.
Sao chép và cấu hình repository
Sao chép repository trên head và tạo tệp cấu hình cục bộ:
git clone https://github.com/MiaAI-Lab/DeepSeek-v4.1-Flash-1017-2x-DGX-Sparks.git
cd DeepSeek-v4.1-Flash-1017-2x-DGX-Sparks
cp scripts/local.sh.example scripts/local.shChỉnh sửa scripts/local.sh và đặt ít nhất WORKER thành đích SSH của worker. Nếu tuyến SSH đến worker khác với tuyến fabric trực tiếp, hãy đặt FABRIC_PEER thành địa chỉ ConnectX-7 của worker.
Hầu hết thiết lập được định nghĩa trong scripts/config.sh. Các giá trị thường dùng gồm:
MODEL_IDvàMODEL_REVISIONcho checkpoint EXL3 đã ghim.CONTEXT, mặc định là1048576.PARALLEL, mặc định là bốn yêu cầu đồng thời.HF_TOKEN, nếu cần xác thực Hugging Face.ABLIT, chọn chế độ gốc hoặc đã abliterated.
Chạy kiểm tra khô trước khi khởi động
Sử dụng chế độ dry-run để kiểm tra liên kết được phát hiện và các lệnh Docker mà không tạo thay đổi:
DRY_RUN=1 ./start.shKho lưu trữ cũng thực hiện kiểm tra cú pháp shell và xác thực các điều kiện dự kiến về mạng, Docker, GPU, SSH và bộ nhớ trong quá trình chuẩn bị. Quá trình khởi động sẽ từ chối tiếp tục trừ khi lượng bộ nhớ khả dụng tối thiểu đã cấu hình, MIN_AVAIL_GIB, khả dụng trên cả hai Spark.
Khởi động máy chủ hai hạng
Khởi động toàn bộ quá trình triển khai từ máy đầu:
./start.shTrong lần chạy đầu tiên, tập lệnh xây dựng image TensorFold, tải checkpoint và các bảng Engram, chuẩn bị bảng RoPE và dữ liệu định tuyến hình ảnh, tạo các tệp token và hạng, cấu hình bộ nhớ của worker rồi khởi động cả hai hạng. Việc xây dựng image Zig mất khoảng sáu phút trên một Spark và tạo ra image có dung lượng khoảng 24.9 GB.
Sau khi khởi động, tập lệnh chờ API và chạy kiểm tra nhanh. Lần khởi chạy thành công sẽ báo rằng DeepSeek-V4.1-Flash-1017 đang hoạt động trên cổng 8888.
Các lệnh quản lý vòng đời hữu ích gồm:
./start.sh restart
./stop.shSử dụng restart sau khi thay đổi thiết lập phục vụ. Tập lệnh dừng sẽ lưu nhật ký đã nén, giữ lại các nhật ký mới nhất theo LOG_KEEP, trước khi xóa các container.
Gọi API tương thích với OpenAI
Client nên sử dụng địa chỉ của máy đầu cùng đường dẫn /v1 và mã định danh mô hình chính xác DeepSeek-V4.1-Flash-1017. Ví dụ, có thể cấu hình client Python tương thích với OpenAI như sau:
from openai import OpenAI
client = OpenAI(
base_url="http://<head-address>:8888/v1",
api_key="unused"
)
response = client.chat.completions.create(
model="DeepSeek-V4.1-Flash-1017",
messages=[
{"role": "user", "content": "Explain tensor parallelism briefly."}
],
max_tokens=512
)
print(response.choices[0].message.content)Mô hình sẽ suy nghĩ trước khi trả lời, trừ khi yêu cầu tắt tính năng suy nghĩ. Hãy cấp đủ max_tokens cho phần suy luận và câu trả lời cuối cùng, hoặc cấu hình các thiết lập suy nghĩ và suy luận liên quan trong môi trường.
Xác thực văn bản, công cụ, hình ảnh và prompt dài
Kho lưu trữ có các tiện ích xác thực để kiểm tra endpoint đang chạy:
python3 tools/validate.py http://<head-address>:8888 --model DeepSeek-V4.1-Flash-1017
API_URL=http://<head-address>:8888 python3 tools/toolcheck.pyBộ kiểm tra xác thực bao phủ văn bản, tính năng suy nghĩ, công cụ, đầu vào hình ảnh và prompt dài. README lưu ý rằng đầu vào hình ảnh và công cụ xác thực chưa được kiểm tra đầy đủ trên cặp phần cứng được báo cáo, vì vậy hãy xem các bài kiểm tra này là kiểm tra triển khai thay vì bảo đảm.
Để chẩn đoán thêm, hãy xem nhật ký của các hạng:
docker logs -f dsv41-1017-exl3-tf
ssh <worker> docker logs -f dsv41-1017-exl3-tfSử dụng chế độ abliterated
Cấu hình mặc định sử dụng checkpoint Mia EAQ 2.9-bit nguyên bản. Đặt ABLIT=1 sẽ giữ checkpoint đó và áp dụng overlay Keys tương ứng từ drowzeys/keys-DeepSeek-V4.1-Flash-1017-Abliterated.
Đây là một kho Hugging Face bị giới hạn quyền truy cập. Trước khi chuẩn bị, hãy chấp nhận các điều khoản của kho và xác thực bằng tài khoản có quyền truy cập:
hf auth login
ABLIT=1 ./scripts/prepare.sh
ABLIT=1 ./start.sh restartNgoài ra, có thể cung cấp token mà không lưu token vào lịch sử shell:
read -rsp 'Hugging Face read token: ' HF_TOKEN; echo
export HF_TOKEN
ABLIT=1 ./start.sh restart
unset HF_TOKENOverlay được cố định theo ABLIT_REVISION. Quá trình chuẩn bị tạo các đường dẫn bộ nhớ đệm và bộ nhớ đệm theo hạng riêng biệt để dữ liệu nguyên bản và dữ liệu abliterated không vô tình bị trộn lẫn. Các shard được viết lại có thể cần dung lượng tương đương một checkpoint khác, ngoài overlay và các tệp hạng. Chuyển về chế độ nguyên bản bằng:
ABLIT=0 ./start.sh restartREADME nêu rõ rằng các kết quả về hiệu năng và độ chính xác của chế độ nguyên bản không xác thực chế độ abliterated trên engine này. Đồng thời, hãy giữ cùng một thiết lập ABLIT cho quá trình chuẩn bị và khởi động.
Hướng dẫn về hiệu năng và tinh chỉnh
Các phép đo được báo cáo với prompt gồm văn xuôi và mã thực tế đạt khoảng 74.9 token mỗi giây cho một luồng văn xuôi và 109.9 token mỗi giây cho một luồng mã. Với bốn luồng, thông lượng tổng đạt khoảng 130.0 token mỗi giây đối với văn xuôi và 155.5 token mỗi giây đối với mã. Tốc độ prefill đo được khoảng 2,000 đến 2,180 token mỗi giây trên các prompt từ 8K đến 256K token.
Kết quả phụ thuộc vào nội dung prompt, xung nhịp GPU, tải đồng thời, bộ nhớ lưu trữ và áp lực bộ nhớ. Các bài benchmark dùng từ ngẫu nhiên tạo bản nháp kém hiệu quả hơn văn xuôi hoặc mã thông thường, vì vậy không nên xem các chỉ số giải mã thấp hơn của chúng là giới hạn chung của engine.
- Giữ các bảng Engram trên ổ đĩa cục bộ của cả hai Spark.
- Sử dụng mức giới hạn xung nhịp GPU tương ứng vì các hạng song song tensor phải đồng bộ nhiều lần.
- Giữ
CONTEXTtrong phạm vi dung lượng bộ nhớ của máy đầu, đặc biệt khi máy này chạy phần mềm khác. - Sử dụng
PARALLELmột cách thận trọng khi phục vụ prompt dài hoặc nhiều người dùng đồng thời. - Sử dụng
DRY_RUN=1trước khi thay đổi thiết lập mạng hoặc triển khai.
Các công tắc và bản vá engine tùy chọn
Kho lưu trữ có các bản vá engine trong zig/patches/. Chúng được tắt theo mặc định và được truyền đến cả hai hạng thông qua start.sh. README cho biết image mặc định đã được kiểm tra để tạo ra các mã băm token giống hệt nhau trong nhiều kịch bản prompt và mức độ đồng thời.
TF_DS_ENGRAM_LANES=2 bật vòng I/O thứ hai cho các thao tác đọc Engram, nhưng kết quả đo cho thấy tốc độ chậm hơn trên thiết bị lưu trữ được kiểm thử. TF_DS_IDX_SPLIT=1 chia các hàng của bộ lập chỉ mục prefill giữa các rank, nhưng không cho thấy mức cải thiện đo được trên cặp được kiểm thử. Nếu các rank không thống nhất về thiết lập này, cặp có thể bị treo, vì vậy tùy chọn này vẫn bị tắt theo mặc định.
Bản vá 0005 cải thiện việc xen kẽ prompt-pass để các luồng hiện có nhận được các lượt giải mã trong khi một prompt dài khác đang được prefetch. Hành vi này có thể được điều chỉnh bằng PREFILL_INTERLEAVE_MS. Bản vá 0006 giữ lại trạng thái prompt cho đầu vào hình ảnh khi không sử dụng TF_DS_IMAGE_CACHE=0 để tắt hành vi đó.
Giám sát bộ nhớ và tránh kích thước ngữ cảnh không an toàn
Bộ nhớ là ràng buộc vận hành chính. README cho biết ngữ cảnh 512K có thể hoạt động thực tế trên một máy còn khoảng 6 GiB bị phần mềm khác sử dụng, trong khi cấu hình 655K có thể thấp hơn ngưỡng bảo vệ bộ nhớ khi cuộc hội thoại phát triển. Một watchdog được tích hợp vì Spark có thể bị đóng băng khi chạm mức bộ nhớ tối thiểu trong lúc xử lý đồng thời nhiều prompt dài.
Hãy bắt đầu với giá trị CONTEXT mặc định hoặc thận trọng, kiểm thử bằng khối lượng công việc thực tế và theo dõi bộ nhớ trống trong các lịch sử dài. Bộ nhớ trống có thể giảm khi cuộc hội thoại được lưu trong bộ nhớ đệm phát triển, ngay cả khi mô hình đã tải thành công.
Kết luận
Kho lưu trữ này cung cấp một cách tự động để phân phối DeepSeek-V4.1-Flash-1017 trên hai DGX Spark được kết nối trực tiếp. Khi phần cứng, mạng RoCE, SSH, Docker, bộ nhớ lưu trữ và quyền truy cập Hugging Face đã sẵn sàng, start.sh sẽ xử lý quy trình thiết lập nhiều giai đoạn và cung cấp một endpoint tương thích với OpenAI quen thuộc.
Để triển khai đáng tin cậy, hãy ưu tiên bộ nhớ Engram cục bộ, xung nhịp GPU đồng nhất, kích thước ngữ cảnh thận trọng và việc kiểm thử kỹ các khối lượng công việc liên quan đến hình ảnh, công cụ và ngữ cảnh dài. Overlay abliterated cùng các tùy chọn chuyển đổi engine có thể dùng để thử nghiệm, nhưng các phép đo hiệu năng và độ chính xác được ghi nhận chủ yếu áp dụng cho checkpoint gốc và cấu hình engine mặc định.
