স্থানীয় LLM মডেল বেঞ্চমার্ক
পটভূমি
আমি Anarchy (YC W23)-এ পার্ট-টাইম ইঞ্জিনিয়ারিং ইন্টার্ন হিসেবে কাজ করার সময় LLM Speed Benchmark (LLMSB) তৈরি করেছিলাম। LLMSB হলো একটি বেঞ্চমার্কিং টুল, যা একটি LLM মডেলের কর্মক্ষমতা মূল্যায়নের জন্য ব্যবহৃত হয়। এটি HuggingFace-এর transformers লাইব্রেরি ব্যবহার করে একটি LLM মডেল লোড ও চালায় এবং এটি পরিমাপ করে:
- মোট রানটাইম
- প্রতি সেকেন্ডে টোকেন
- সাধারণ হার্ডওয়্যার স্পেসিফিকেশন
- সিপিইউ ব্যবহার (বর্তমান ফ্রিকোয়েন্সি ও সময়ের সাথে কোরগুলোর ব্যবহারের শতাংশ)
- র্যাম ব্যবহার (র্যাম ও সুয়াপের সময়ানুক্রমিক ব্যবহার)
- জিপিইউ ব্যবহার (লোড, মেমরি ব্যবহার, ও তাপমাত্রার সময়ানুক্রমিক পরিবর্তন)
এখানে একটি বেঞ্চমার্ক রান-এর উদাহরণ রয়েছে, যেখানে codellama-13b-oasst-sft-v10 মডেলটি একটি H100-এ চালানো হয়েছে। আমার ব্যক্তিগতভাবে একটি Nvidia RTX 2070 Ti রয়েছে, যার 8 GB VRAM আছে। দুঃখজনকভাবে, বেশিরভাগ আধুনিক LLM মডেলের জন্য 8 GB VRAM একটি মডেলের সাথে ইন্টারফেস করার জন্য যথেষ্ট নয়। এ কারণে, আমি নির্দিষ্ট কিছু মডেলে আমার বেঞ্চমার্ক চালানোর জন্য GPU(s) “ভাড়া” নিতে RunPod ব্যবহার করেছি।
এটাই ছিল LLMSB-এর পটভূমি/উৎপত্তির গল্প। যেহেতু প্রকল্পটি ওপেন-সোর্স, আপনি কোডটি এখানে দেখতে পারেন। নিচে, আপনি যদি এটি দেখতে চান, তাই আমি রিপোর README যুক্ত করেছি।
সম্পর্কে
🚧 LLM Speed Benchmark (LLMSB) বর্তমানে বেটা (v0)-তে রয়েছে। অনুগ্রহ করে এটি প্রোডাকশনে ব্যবহার করবেন না, অথবা নিজের ঝুঁকিতে ব্যবহার করুন। আমরা এখনও কিছু খুঁত ঠিক করছি এবং কার্যকারিতা উন্নত করছি। আপনি যদি কোনো বাগ পান বা কোনো পরামর্শ থাকে, অনুগ্রহ করে তা ISSUES-এ জানাবেন। আপনার মতামত অমূল্য!
LLM Speed Benchmark (LLMSB) হলো একটি বেঞ্চমার্কিং টুল, যা বিভিন্ন হার্ডওয়্যার প্ল্যাটফর্ম জুড়ে LLM মডেলগুলোর কর্মক্ষমতা মূল্যায়নের জন্য ব্যবহৃত হয়। এর চূড়ান্ত লক্ষ্য হলো বিভিন্ন সিস্টেমে LLM মডেলগুলোর কর্মক্ষমতা সম্পর্কিত একটি বিস্তৃত ডেটাসেট সংকলন করা, যাতে ব্যবহারকারীরা তাদের প্রকল্পের জন্য আরও কার্যকরভাবে সঠিক LLM মডেল(গুলো) নির্বাচন করতে পারেন।
সীমাবদ্ধতাসমূহ
LLMSB v0-তে রয়েছে, তাই এর কিছু সীমাবদ্ধতা আছে:
- এটি কেবল Debian-ভিত্তিক অপারেটিং সিস্টেমে চালানোর জন্য তৈরি, অর্থাৎ এটি Windows-এ চালানোর জন্য তৈরি নয়। এর কারণ হলো LLMSB অভ্যন্তরে মেট্রিক সংগ্রহের জন্য neofetch এবং nvidia-smi ব্যবহার করে এবং ফাইলপাথের লজিক Unix অপারেটিং সিস্টেমের উপর ভিত্তি করে।
- মেট্রিক যেভাবে রেকর্ড করা হয়, তার কারণে মেট্রিক সংগ্রাহকের একটি সংগ্রহ সম্পন্ন করতে 1 সেকেন্ড পর্যন্ত সময় লাগতে পারে। এর অর্থ হলো, সর্বোচ্চ দ্রুততায়, আমরা প্রতি 1 সেকেন্ডে হার্ডওয়্যার মেট্রিক সংগ্রহ করতে পারি।
- LLMSB কেবল HuggingFace ব্যবহার করে মডেল লোড ও চালায়। আপাতত এটি কাজ করে, কিন্তু লক্ষ্য হলো LLMSB-কে কেবল HuggingFace নয়, একাধিক ফ্রেমওয়ার্ক সমর্থন করানো।
- বর্তমানে, সব মডেল
run_llm()ফাংশনে উপস্থাপিত লজিকের মাধ্যমে চালানো হয়, যাsrc/hf.py-তে অবস্থিত, যেখানেAutoTokenizer()এবংAutoModelForCausalLM()ফাংশনগুলো ব্যবহার করে একটি মডেল লোড ও চালানো হয়। এটি কাজ করে, তবে এতে নির্দিষ্ট মডেলগুলো কীভাবে কনফিগার/অপ্টিমাইজ করতে পারি, তা সীমিত হয়ে যায়। এটি জেনেও, লক্ষ্য হলো প্রতিটি জনপ্রিয় মডেলের জন্য আলাদা ক্লাস তৈরি করা এবং তার বদলে HuggingFace-এর মডেল-নির্দিষ্ট ক্লাসগুলো, যেমনLlamaTokenizerওLlamaForCausalLM, ব্যবহার করা। - LLMSB কেবল সাধারণ, উচ্চ-স্তরের মেট্রিক সংগ্রহ করে। ভবিষ্যতে, আমরা নিম্ন-স্তরের মেট্রিক সংগ্রহ করতে চাই। আমরা মনে করি, এটি আংশিকভাবে Pytorch-এর porfiler wrapper ব্যবহার করে করা যেতে পারে।
নমুনা আউটপুট
২০২৩ সালের ২২ নভেম্বর
LLMSB-কে RunPod-এর মাধ্যমে একটি L40 এবং H100 GPU-তে চালানো/পরীক্ষা করা হয়েছিল। সেই বেঞ্চমার্কগুলোতে llama-2-7b-hf, codellama-13b-oasst-sft-v10, এবং mpt-7b মডেলগুলো পরীক্ষা করা হয়েছিল। ফলাফলগুলো এখানে দেখুন। যদি কোনো ত্রুটি/সমস্যা লক্ষ্য করা যায়, অনুগ্রহ করে সেগুলো ISSUES-এ রিপোর্ট করুন।
সেটআপ
-
পাইথন পরিবেশ তৈরি ও সক্রিয় করুন:
python3 -m venv env source env/bin/activate -
প্যাকেজের নির্ভরতাগুলো ইনস্টল করুন (APT ব্যবহার করে):
apt -y update apt install -y vim apt install -y neofetch -
পাইথনের নির্ভরতাগুলো ইনস্টল করুন:
pip3 install transformers pip3 install psutil pip3 install gputil pip3 install tabulate pip3 install sentencepiece pip3 install protobuf -
Pytorch ইনস্টল করুন
# CUDA 12.1 ব্যবহার করে, Linux-এর জন্য, pytorch stable build ইনস্টল করুন: pip3 install torch torchvision torchaudio -
LLM-VM ইনস্টল করুন:
pip install llm-vm -
(ঐচ্ছিক) আপনি যদি LLAMA-এর মতো মডেল ব্যবহার করেন, তাহলে আপনাকে একটি HuggingFace অ্যাক্সেস টোকেন লাগবে। আপনার অ্যাক্সেস টোকেন এখানে সেটআপ করুন, তারপর নিম্নলিখিত কমান্ড চালিয়ে আপনার টোকেন কনসোলে সংরক্ষণ করুন:
huggingface-cli login
কীভাবে চালাবেন
-
সেটআপ অংশে তালিকাভুক্ত ধাপগুলো সম্পন্ন করুন।
-
আপনার সেট কনফিগার করতে, আপনাকে নিম্নলিখিত প্যারামিটারসহ একটি json ফাইল তৈরি করতে হবে (এখানে একটি উদাহরণ দেওয়া হলো):
- দ্রষ্টব্য: সব ফ্রেমওয়ার্ক একই প্যারামিটার সমর্থন করে না
{ "model": "bigscience/bloom-560m", # HuggingFace-এ মডেলের path/repo (https://huggingface.co/models) "prompt": "Hello World!", # আপনি LLM মডেলে যে prompt ইনপুট দিতে চান "device": "cuda:0", # যে device-এ আপনি LLM মডেল চালাতে চান (GPU/CPU) "max_length": 50, # উৎপন্ন token-এর সর্বাধিক দৈর্ঘ্য "temperature": 0.9, # LLM মডেলের জন্য temperature মান "top_k": 50, # LLM মডেলের জন্য top-k মান "top_p": 0.9, # LLM মডেলের জন্য top-p মান "num_return_sequences": 1, # মডেলের স্বাধীনভাবে চালানো instance-এর সংখ্যা "time_delay": 0, # time delay (seconds) যা metrics-collecter প্রতি interation-এ অপেক্ষা করবে "model_start_pause": 1, # LLM মডেল চালানোর BEFORE-এ test যে সময় (seconds) অপেক্ষা করবে "model_end_pause": 1 # LLM মডেল শেষ হওয়ার AFTER-এ test যে সময় (seconds) অপেক্ষা করবে, "framework": "llm-vm" # মডেল চালানোর জন্য আপনি যে framework/library ব্যবহার করতে চান তার নাম } -
আগের ধাপে আপনার তৈরি করা config ফাইলের path ব্যবহার করে, বেঞ্চমার্ক শুরু করতে নিম্নলিখিতটি চালান (একটি বিকল্প বেছে নিন):
# একটি বেঞ্চমার্ক চালান python3 run.py --config ./configs/llmvm_test.json # একাধিক বেঞ্চমার্ক চালান (এই ক্ষেত্রে 3টি) python3 run.py --config ./configs/llmvm_test.json --loops 3 -
বেঞ্চমার্ক শেষ হওয়ার পরে, চূড়ান্ত ফলাফলগুলো এমন একটি ফাইলে দেখুন, যা এরকম দেখতে হবে:
report_2023-11-25_05:55:04.207515_utc_1ffc4fa7-3aa9-4878-b874-1ff445e1ff8a.json
RunPod সেটআপ করা:
-
RunPod সেটআপ করুন, আপনার ssh cert/key সেটআপ করুন, এবং একটি pod চালু করুন। আপনি RunPod-এর Console Page-এ আপনার pod(s) অ্যাক্সেস করতে পারবেন।
-
ssh connection info পাওয়ার জন্য “Connect” বোতামে ক্লিক করুন। এই তথ্যটি এরকম দেখতে হবে:
ssh root&12.345.678.90 -p 12345 -i ~/.ssh/id_example-
এই কমান্ডটি এভাবে ফরম্যাট করা হবে:
ssh <user>@<ip-address> -p <port> -i <local-path-to-ssh-cert>
-
-
ধাপ #2-এ থাকা কমান্ড ব্যবহার করে, আপনি pod-এ ssh করতে এবং আপনি যে RunPod pod-এ GPU নির্বাচন করেছেন সেটি ব্যবহার করতে সক্ষম হওয়া উচিত।
-
আপনি যদি pod থেকে আপনার লোকাল মেশিনে একটি ফাইল কপি করতে চান, তাহলে আপনি এই ফরম্যাটে কমান্ডটি চালাবেন (এটি ধাপ #2-এ দেখানো ভেরিয়েবলগুলোর প্রতি ইঙ্গিত করছে):
scp -P <port> -i <local-path-to-ssh-cert> <user>@<ip-address>:<path-to-file-in-pod> <path-to-local-directory>-
এমন একটি কমান্ডের উদাহরণ এখানে দেওয়া হলো:
scp -P 12345 -i ~/.ssh/id_example <user>@<ip-address>:/root/test.txt /home/user1/Downloads/
-
-
pod-টির কাজ শেষ হলে, সেটি বন্ধ বা পজ করুন। তবে সতর্কতা: আপনি যদি এটি পজ করেন, তবুও আপনার চার্জ হবে, শুধু অনেক কম।
চমৎকার উৎসসমূহ:
- Prompt ডেটাসেট: awesome-chatgpt-prompts, bigscience/P3, এবং writing-prompts
- LLM প্যারামিটার সম্পর্কে আরও জানুন
- ক্লাউড-ভিত্তিক LLM মডেল বেঞ্চমার্ক করার জন্য চমৎকার বেঞ্চমার্ক
- দারুণ LLM ইন্টেলিজেন্স লিডারবোর্ড: FastEval এবং open_llm_leaderboard