সংক্ষিপ্ত বিবরণ
এই প্রকল্পটি একটি NVIDIA DGX Spark থেকে OpenAI-সামঞ্জস্যপূর্ণ API-এর মাধ্যমে Qwen3.8 Flash Next পরিবেশন করে। এতে TensorFold v0.3.6.3, MTP ড্রাফট হেডসহ একটি MLX 4-bit চেকপয়েন্ট এবং উৎপাদিত টেক্সট পরিবর্তন না করে প্রম্পট প্রসেসিং দ্রুত করার জন্য তৈরি বিভিন্ন প্যাচ ব্যবহার করা হয়েছে।
ডিফল্ট কনফিগারেশনটি পাঁচটি সমসাময়িক রিকোয়েস্ট সমর্থন করে, যেখানে প্রতিটির জন্য মডেলের পূর্ণ 262,144-টোকেন কনটেক্সট উইন্ডো থাকে। এটি CUDA-তে মডেলের নিজস্ব ভিশন টাওয়ারও লোড করে, ফলে চ্যাট মেসেজে ছবি ও ভিডিও রাখা যায়।
- API মডেল ID:
Qwen3.8-Flash-Next - ডিফল্ট এন্ডপয়েন্ট:
http://<spark-address>:8888/v1 - সমান্তরাল স্ট্রিম: 5
- প্রতি স্ট্রিমে কনটেক্সট: 262,144 টোকেন
- মোট KV পুল: 1,310,720 টোকেন
- KV ক্যাশ: ডিফল্টভাবে int8
- ইনপুট মোড: টেক্সট, ছবি ও ভিডিও
প্রধান বৈশিষ্ট্য
দীর্ঘ-কনটেক্সট সমসাময়িক ইনফারেন্স
TensorFold প্রতিটি স্ট্রিমের জন্য আলাদা পূর্ণ কনটেক্সট ক্যাশ বরাদ্দ করে। ডিফল্ট সেটিংসে পাঁচটি স্ট্রিমের প্রতিটিতে 262,144-টোকেনের প্রম্পট ও উত্তরের উইন্ডো থাকে। এর ফলে int8 KV পুলে প্রায় 23.4 GiB মেমরি লাগে।
OpenAI-সামঞ্জস্যপূর্ণ পরিবেশন
সার্ভারটি /v1/models এবং /v1/chat/completions-এর মতো এন্ডপয়েন্ট প্রকাশ করে। OpenAI-সামঞ্জস্যপূর্ণ ক্লায়েন্টগুলো বেস URL পরিবর্তন করে এবং Qwen3.8-Flash-Next মডেল ID নির্বাচন করে সংযুক্ত হতে পারে।
মাল্টিমোডাল প্রম্পট
ব্যবহারকারীর মেসেজে OpenAI-স্টাইলের image_url ও video_url কনটেন্ট অংশ থাকতে পারে। সমর্থিত ছবির ফরম্যাটের মধ্যে রয়েছে JPEG, PNG ও WebP। ভিডিওতে MP4, WebM, MOV, MKV অথবা FFmpeg ডিকোড করতে পারে এমন অন্য কোনো ফরম্যাট ব্যবহার করা যেতে পারে।
প্যাচ করা প্রম্পট প্রসেসিং
অন্তর্ভুক্ত TensorFold প্যাচগুলো SSD read-ahead, নেটিভ থ্রেডেড রিড, উন্নত sparse-attention ব্লক নির্বাচন, কনফিগারযোগ্য প্রম্পট খণ্ড, কপি ড্রাফট, লাইভ টোকেন কাউন্টার এবং Flash Next ভিশন সাপোর্ট যোগ করে। রিপোজিটরির পরিমাপ অনুযায়ী, তুলনা করা আনপ্যাচড সংস্করণের চেয়ে প্রম্পট প্রসেসিং প্রায় 1.7 গুণ দ্রুত, আর পরীক্ষিত টেক্সট উত্তরগুলো byte-identical থাকে।
সিস্টেমের প্রয়োজনীয়তা
রিপোজিটরি ক্লোন করার আগে হোস্ট প্রস্তুত করুন:
- একটি NVIDIA DGX Spark অথবা 128 GB unified memory-সহ অন্য কোনো GB10 সিস্টেম।
- ডিফল্ট কনফিগারেশন চালু করার সময় প্রায় 115 GiB খালি মেমরি।
- NVIDIA container runtime-সহ Docker।
dockerগ্রুপের সদস্য একটি ব্যবহারকারী অ্যাকাউন্ট।- নতুন সিস্টেমে প্রায় 160 GB খালি ডিস্ক স্পেস।
- ঐচ্ছিক: দ্রুততর resumable download-এর জন্য Hugging Face
hfCLI। - ঐচ্ছিক:
~/.cache/huggingface/token-এ একটি Hugging Face token অথবাHF_TOKENenvironment variable।
ডিফল্ট ডিপ্লয়মেন্টটি অন্য কোনো কাজ না চলা DGX Spark-এর জন্য নির্ধারিত। unified-memory সিস্টেমে মেমরি সম্পূর্ণ শেষ হয়ে গেলে স্বাভাবিক allocation error দেখানোর পরিবর্তে মেশিনটি আটকে যেতে পারে।
ইনস্টলেশন ও প্রথম চালু করা
1. রিপোজিটরি ক্লোন করুন
git clone https://github.com/MiaAI-Lab/Qwen3.8-Flash-Next-Single-DGX-Spark-TensorFold.git
cd Qwen3.8-Flash-Next-Single-DGX-Spark-TensorFold2. সার্ভার চালু করুন
./start.shপ্রথমবার চালু হলে সম্পূর্ণ সেটআপ সম্পন্ন হয়। উপলভ্য থাকলে এটি আগে থেকে তৈরি container image সংগ্রহ করে, প্রায় 106 GiB-এর চেকপয়েন্ট ডাউনলোড ও যাচাই করে এবং GB10-এর জন্য CUDA kernel কম্পাইল করে। আগে থেকে তৈরি image-এর আকার প্রায় 11 GB, আর চেকপয়েন্টটি Hugging Face cache-এ প্রায় 114 GB স্থান নেয়।
চালুর সময় স্ক্রিপ্টটি সেটআপের অগ্রগতি, সার্ভার লগ, ওজন লোডের অগ্রগতি এবং মেমরির আনুমানিক হিসাব দেখায়। এরপর এটি একটি smoke test চালায়। সফলভাবে চালু হলে শেষে একটি বার্তা দেখায় যে Qwen3.8-Flash-Next 8888 পোর্টে সক্রিয়।
README অনুযায়ী, পরবর্তী চালুগুলো সম্পন্ন সেটআপের কাজগুলো এড়িয়ে যায় এবং ওজন লোড করতে প্রায় 2.5 মিনিট সময় নেয়।
3. চালু না করে প্রস্তুত করুন
আগে থেকেই সবকিছু ডাউনলোড ও বিল্ড করতে চাইলে চালান:
scripts/prepare.shContainer image শুরু থেকে পুনরায় বিল্ড করতে:
scripts/prepare.sh --rebuildপ্রস্তুতি স্ক্রিপ্টটি Docker, NVIDIA runtime এবং ডিস্ক স্পেস পরীক্ষা করে। এরপর এটি TensorFold image সংগ্রহ বা বিল্ড করে, Hugging Face cache-এ চেকপয়েন্ট ডাউনলোড করে এবং tensorfold info দিয়ে মডেল যাচাই করে।
মৌলিক API ব্যবহার
উপলভ্য মডেল পরীক্ষা করুন
curl -s http://<spark-address>:8888/v1/models<spark-address>-এর স্থানে DGX Spark-এর hostname বা IP address দিন। Spark থেকেই কল করলে 127.0.0.1 ব্যবহার করতে পারেন।
চ্যাট কমপ্লিশন রিকোয়েস্ট পাঠান
curl -s http://<spark-address>:8888/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{
"model": "Qwen3.8-Flash-Next",
"messages": [
{
"role": "user",
"content": "Write a Python fibonacci function."
}
],
"max_tokens": 1000
}'ডিফল্টভাবে মডেল উত্তর দেওয়ার আগে চিন্তা করে, এবং এই reasoning response token allowance-এর মধ্যে গণনা হয়। reasoning ও চূড়ান্ত উত্তর উভয় সামলানোর জন্য max_tokens যথেষ্ট বড় রাখুন। reasoning reasoning_content-এ ফেরত আসে, আর চূড়ান্ত উত্তর content-এ থাকে।
OpenAI-সামঞ্জস্যপূর্ণ ক্লায়েন্ট সংযুক্ত করুন
নিচের মানগুলো দিয়ে ক্লায়েন্ট কনফিগার করুন:
- বেস URL:
http://<spark-address>:8888/v1 - মডেল:
Qwen3.8-Flash-Next
API স্ট্রিমিং, টাইপযুক্ত টুল কল, রিজনিং কনটেন্ট, ইমেজ ইনপুট এবং ভিডিও ইনপুট সমর্থন করে। অ্যারের মতো টুল প্যারামিটারগুলো সংশ্লিষ্ট JSON টাইপ ব্যবহার করে ফেরত দেওয়া হয়。
ইমেজ পাঠানো
ডিফল্টভাবে, মিডিয়া অবশ্যই ডেটা URL হিসেবে দিতে হবে। নিচের শেল উদাহরণে একটি JPEG এনকোড করে মডেলকে সেটি বর্ণনা করতে বলা হয়েছে:
IMG=$(base64 -w0 photo.jpg)
curl -s http://<spark-address>:8888/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{
"model": "Qwen3.8-Flash-Next",
"messages": [{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": "data:image/jpeg;base64,'"$IMG"'"
}
},
{
"type": "text",
"text": "What is in this picture?"
}
]
}],
"max_tokens": 2000
}'একটি অনুরোধে সর্বোচ্চ চারটি ইমেজ থাকতে পারে। প্রতিটি ইমেজের আকার সর্বোচ্চ 10 MB এবং সম্মিলিত সীমা 20 MB। সব ইমেজ মিলিয়ে সর্বোচ্চ 4,096 টোকেন ব্যবহার করা যাবে। "detail": "low" সেট করলে একটি ইমেজ 256 টোকেনে সীমাবদ্ধ থাকে。
ভিডিও পাঠানো
ভিডিও video_url কনটেন্ট পার্ট ব্যবহার করে:
{
"type": "video_url",
"video_url": {
"url": "data:video/mp4;base64,..."
}
}প্রতিটি অনুরোধে সর্বোচ্চ দুটি ভিডিও থাকতে পারে। একটি ভিডিওর আকার সর্বোচ্চ 64 MB, সম্মিলিত অনুরোধের সীমা 96 MB এবং ফুটেজের দৈর্ঘ্য সর্বোচ্চ এক ঘণ্টা। ডিফল্টভাবে, সার্ভার প্রতি সেকেন্ডে দুটি ফ্রেম স্যাম্পল করে, পুরো ভিডিওজুড়ে সর্বোচ্চ 256টি ফ্রেম নেয় এবং প্রতি অনুরোধে সর্বোচ্চ 16,384 ভিডিও টোকেন ব্যবহারের অনুমতি দেয়。
ইমেজ ও ভিডিও প্রম্পট প্রিফিক্স পুনঃব্যবহারের জন্য সংরক্ষণ করা হয় না। ভিশন সক্রিয় করলেও সাধারণ টেক্সট অনুরোধে কোনো প্রভাব পড়ে না。
পাবলিক HTTPS মিডিয়া URL অনুমোদন
ডেটা URL ডিফল্ট। সার্ভারকে পাবলিক HTTPS ইমেজ ও ভিডিও URL আনতে দিতে, নিচের কমান্ড দিয়ে এটি পুনরায় চালু করুন:
VISION_URLS=1 ./start.sh restartআপনার ডিপ্লয়মেন্টের নিরাপত্তা ও নেটওয়ার্ক নীতির সঙ্গে সামঞ্জস্যপূর্ণ হলেই কেবল রিমোট ফেচিং সক্রিয় করুন。
শুধু টেক্সট মোডে চালান
শুধু টেক্সট পরিবেশন করতে ভিশন টাওয়ার নিষ্ক্রিয় করুন:
VISION=0 ./start.sh restartশুধু টেক্সট মোডে 0.84 GiB ভিশন টাওয়ার লোড হয় না এবং ভিশন-সক্রিয় ডিফল্ট 2,048 সারির পরিবর্তে 4,096 সারির প্রম্পট চাঙ্ক ব্যবহার করা হয়。
সার্ভার পরিচালনা
নিয়মিত কাজের জন্য রিপোজিটরির র্যাপার স্ক্রিপ্ট ব্যবহার করুন:
./start.sh restart
./stop.sh
docker logs -f qwen38-flash-next-tf
curl -s http://<spark-address>:8888/health./start.sh restartচলমান সার্ভার প্রতিস্থাপনের আগে সেটআপ ও আর্গুমেন্ট যাচাই করে。./stop.shকনটেইনার বন্ধ করে এবং GPU মেমরি ছেড়ে দেয়। সক্রিয় অনুরোধগুলো বাধাগ্রস্ত হয়。docker logs -fTensorFold সার্ভারের লগ অনুসরণ করে。/healthব্যস্ততার অবস্থা এবং লাইভ টোকেনের মোট সংখ্যা জানায়。
সার্ভার ইতিমধ্যে চালু থাকলে, সাধারণ ./start.sh সেটিকে অপরিবর্তিত রাখে। systemd-এর মতো কোনো প্রসেস ম্যানেজারের জন্য ফোরগ্রাউন্ড মোড ব্যবহার করুন:
FOREGROUND=1 ./start.shকনটেক্সট, কনকারেন্সি ও KV নির্ভুলতা কনফিগার করুন
ডিফল্টগুলো scripts/config.sh-এ সংরক্ষিত থাকে। এনভায়রনমেন্ট ভেরিয়েবল দিয়ে সেগুলো ওভাররাইড করুন অথবা start.sh-এর পরে TensorFold ফ্ল্যাগ দিন。
আরও হেডরুমের জন্য কনকারেন্সি কমান
PARALLEL=4 ./start.sh restartচারটি int8 স্ট্রিম 1,048,576 টোকেনের একটি KV পুল প্রদান করে এবং স্টার্টআপের রিপোর্ট করা আনুমানিক হিসাব 97.7 GiB。
ছোট কনটেক্সট উইন্ডো ব্যবহার করুন
./start.sh restart --context 131072অতিরিক্ত কমান্ড-লাইন আর্গুমেন্টগুলো ডিফল্টের পরে tensorfold serve-এ পাঠানো হয়, তাই সেগুলো অগ্রাধিকার পায়। উপলভ্য অপশন দেখতে ./start.sh --help চালান。
অন্য KV ক্যাশ টাইপ বেছে নিন
KV_DTYPE bf16, int8 অথবা int4 গ্রহণ করে:
PARALLEL=6 KV_DTYPE=int4 ./start.sh restartREADME-তে উল্লেখ আছে যে int4 আউটপুটে সামান্য পরিবর্তন আনে এবং কোনো গুণমান পরিমাপ প্রদান করে না। প্রকল্পের ডিফল্ট ভারসাম্য চাইলে int8 ব্যবহার করুন। স্ট্রিম সংখ্যার চেয়ে পূর্ণ-নির্ভুলতার KV স্টোরেজ বেশি গুরুত্বপূর্ণ হলে bf16 ব্যবহার করুন。
স্টার্টআপ সুরক্ষা বুঝুন
TensorFold উপলভ্য মেমরি থেকে RAM-এর এক-দশমাংশের সমান হোস্ট রিজার্ভ বাদ দিয়ে তার বাজেট হিসাব করে। অনুরোধ করা কনফিগারেশনটি উপযুক্ত না হলে, ওয়েট লোড করার আগেই স্টার্টআপ প্রত্যাখ্যান করা হয় এবং ত্রুটিতে এমন একটি কনটেক্সট উইন্ডো জানানো হয় যা উপযুক্ত হওয়ার কথা。
থিংকিং ও স্যাম্পলিং নিয়ন্ত্রণ
ডিফল্ট থিংকিং-মোড স্যাম্পলিং মান হলো temperature 1.0, top-p 0.95 এবং top-k 20। অনুরোধে temperature, top_p, top_k এবং seed ওভাররাইড করা যায়। 0 temperature গ্রিডি ডিকোডিং সক্রিয় করে。
একটি অনুরোধের জন্য থিংকিং নিষ্ক্রিয় করুন
{
"model": "Qwen3.8-Flash-Next",
"messages": [
{"role": "user", "content": "Answer in one sentence."}
],
"chat_template_kwargs": {
"enable_thinking": false
},
"max_tokens": 200
}রিজনিংয়ের প্রচেষ্টা নির্ধারণ করুন
{
"chat_template_kwargs": {
"reasoning_effort": "low"
}
}টেমপ্লেট "xhigh"-ও গ্রহণ করে। রিজনিংয়ের প্রচেষ্টা বাদ দিলে টেমপ্লেট তার medium ডিফল্ট ব্যবহার করে। শীর্ষ-স্তরের OpenAI-স্টাইল reasoning_effort ফিল্ড উপেক্ষা করা হয়, তাই এটি chat_template_kwargs-এর মধ্যে রাখুন。
উন্নত পারফরম্যান্স টিপস
SSD-তে n-gram টেবিল রাখুন
ডিফল্ট PLE_ON_SSD=1 n-gram টেবিলের 29.8 GiB ইউনিফায়েড মেমরিতে রাখার পরিবর্তে SSD-তে রাখে। এতে KV ক্যাশের জন্য মেমরি সংরক্ষিত হয়। তাই ডিফল্ট কনফিগারেশনের জন্য দ্রুত স্থানীয় স্টোরেজ গুরুত্বপূর্ণ。
প্রম্পট চাঙ্কের আকার সতর্কতার সঙ্গে সমন্বয় করুন
ভিশন সক্রিয় থাকলে, ভিশন টাওয়ারের জন্য জায়গা রাখতে TENSORFOLD_PREFILL_ROWS-এর ডিফল্ট মান 2048। শুধু টেক্সট মোডে ডিফল্ট মান 4096। README-তে বলা হয়েছে, প্রায় ৩,০০০ টোকেনের প্রম্পটের ক্ষেত্রে ৪,০৯৬ সারি প্রম্পট প্রক্রিয়াকরণে আনুমানিক ২–৫% উন্নতি করতে পারে, তবে এতে প্রায় ০.৯৪ GiB অতিরিক্ত মেমরি প্রয়োজন।
TENSORFOLD_PREFILL_ROWS=4096 ./start.sh restartপর্যাপ্ত মেমরি অবকাশ থাকলেই কেবল এই মান বাড়ান।
MTP ও কপি ড্রাফট নিয়ন্ত্রণ
ডিফল্ট MTP কনফিগারেশন প্রতি রাউন্ডে সর্বাধিক ছয়টি ড্রাফট তৈরি করে এবং কোনো ড্রাফটের আত্মবিশ্বাস ৬০%-এর নিচে নেমে গেলে চেইন থামিয়ে দেয়। TENSORFOLD_MTP_COPY=1 দিয়ে কপি-ড্রাফট অপ্টিমাইজেশন সক্রিয় করা হয় এবং এর জন্য কমপক্ষে দুটি সমান্তরাল স্ট্রিম প্রয়োজন। আগের প্রম্পটের লেখা উদ্ধৃত বা সম্পাদনা করা উত্তরের উন্নতির জন্য এটি তৈরি করা হয়েছে।
সিরিয়াল রেফারেন্স ডিকোডিং অনুরোধ
কোনো নির্দিষ্ট অনুরোধে ড্রাফটিং এড়িয়ে TensorFold-এর একবারে একটি টোকেনের রেফারেন্স পথ ব্যবহার করতে যোগ করুন:
{
"draft": false
}স্পেকুলেটিভ ডিকোডিংয়ের সঙ্গে সিরিয়াল রেফারেন্সের তুলনা করার সময় এটি কার্যকর।
প্রস্তুতি জোরপূর্বক চালানো বা এড়িয়ে যাওয়া
PREPARE=1 ./start.sh restart
PREPARE=0 ./start.sh restart
PULL=0 scripts/prepare.shPREPARE=1পুনরায় চালুর আগে প্রস্তুতি যাচাই জোরপূর্বক চালায়।PREPARE=0প্রস্তুতি এড়িয়ে যায়।PULL=0আগে থেকে তৈরি রেজিস্ট্রি ইমেজ ব্যবহারের চেষ্টা না করে স্থানীয়ভাবে ইমেজ তৈরি করে।
patches/-এর ফাইল পরিবর্তন করার পর ইমেজ পুনর্নির্মাণ করুন, যাতে ওই প্যাচগুলো TensorFold-এ অন্তর্ভুক্ত হয়।
যাচাই ও বেঞ্চমার্কিং
রিপোজিটরিতে চলমান সার্ভারে কল করার জন্য ইউটিলিটি অন্তর্ভুক্ত রয়েছে। তাদের API URL-এর ডিফল্ট মান http://127.0.0.1:8888।
tools/bench.py local-test
tools/needle.py
tools/toolcheck.py
tools/visioncheck.pytools/bench.pyবিভিন্ন প্রম্পটের আকার পরিমাপ করে এবং একটি সংক্ষিপ্ত ডিকোড পরীক্ষা চালায়।tools/needle.pyপ্রায় ১৯৫,০০০ টোকেনের প্রম্পটে একটি পাসফ্রেজ লুকিয়ে রেখে সেটি পুনরুদ্ধার যাচাই করে।tools/toolcheck.pyপরীক্ষা করে যে অ্যারে-মানের টুল প্যারামিটার JSON অ্যারে হিসেবে ফেরত আসে কি না।tools/visioncheck.pyএকটি লাল বৃত্ত ও নীল বর্গযুক্ত জেনারেট করা ছবি পাঠায়, এরপর দুটিই শনাক্ত হয়েছে কি না পরীক্ষা করে।
অন্য কোনো মেশিন থেকে পরীক্ষা করতে API_URL সেট করুন:
API_URL=http://<spark-address>:8888 tools/bench.py remote-testপ্রত্যাশিত পারফরম্যান্স
int8 KV ক্যাশিং, SSD-নির্ভর n-gram টেবিল এবং MTP ড্রাফটিং ব্যবহার করে একটি DGX Spark-এ রিপোজিটরিটি নিচের ডিকোড ফলাফল জানায়:
- একটি অনুরোধ: প্রতি সেকেন্ডে ৬২.৪ টোকেন, প্রথম টোকেন পেতে সময় ১৫২ ms।
- দুটি অনুরোধ: সমন্বিতভাবে প্রতি সেকেন্ডে ৯০.৫ টোকেন।
- চারটি অনুরোধ: সমন্বিতভাবে প্রতি সেকেন্ডে ১০৬.৭ টোকেন।
- পাঁচটি অনুরোধ: সমন্বিতভাবে প্রতি সেকেন্ডে ১১৯.৩ টোকেন, অর্থাৎ প্রতি অনুরোধে প্রতি সেকেন্ডে ২৭.০ টোকেন।
রিপোর্ট করা প্রিফিল গতি ৮,২২৯ টোকেনের প্রম্পটের ক্ষেত্রে আনুমানিক প্রতি সেকেন্ডে ২,৫০৩ টোকেন থেকে ১,৩১,১১০ টোকেনের প্রম্পটের ক্ষেত্রে প্রতি সেকেন্ডে ২,২০০ টোকেন পর্যন্ত। এগুলো প্রকল্পের পরিমাপ, নিশ্চয়তা নয়; কনফিগারেশন, প্রম্পটের কাঠামো, মিডিয়া ইনপুট, স্টোরেজ এবং উপলভ্য মেমরির ওপর ভিত্তি করে ফলাফল পরিবর্তিত হতে পারে।
উপসংহার
এই রিপোজিটরিতে একটি DGX Spark-এ Qwen3.8 Flash Next পরিবেশন করার জন্য প্রয়োজনীয় মডেল, TensorFold রানটাইম, CUDA-নির্দিষ্ট সেটআপ, পারফরম্যান্স প্যাচ এবং অপারেশনাল স্ক্রিপ্ট একত্র করা হয়েছে। ডিফল্ট int8, পাঁচ-স্ট্রিম কনফিগারেশন দিয়ে শুরু করুন, OpenAI-সামঞ্জস্যপূর্ণ API-এর মাধ্যমে পরিষেবাটি যাচাই করুন, তারপর আপনার কাজের ধরন ও মেমরি অবকাশ অনুযায়ী সমান্তরালতা, কনটেক্সটের আকার, ভিশন এবং KV precision সমন্বয় করুন।
