![]() | ![]() | ![]() |
আমরা CodeGemma উপস্থাপন করছি, Google DeepMind-এর জেমা মডেলের উপর ভিত্তি করে খোলা কোড মডেলের একটি সংগ্রহ (Gemma Team et al., 2024)। CodeGemma হল হালকা ওজনের, অত্যাধুনিক ওপেন মডেলের একটি পরিবার যা একই গবেষণা এবং প্রযুক্তি থেকে তৈরি করা হয় যা জেমিনি মডেল তৈরি করতে ব্যবহৃত হয়।
Gemma পূর্বপ্রশিক্ষিত মডেল থেকে অব্যাহত, CodeGemma মডেলগুলিকে আরও প্রশিক্ষিত করা হয় প্রাথমিকভাবে কোডের 500 থেকে 1000 বিলিয়ন টোকেনগুলিতে, একই আর্কিটেকচারগুলি ব্যবহার করে জেমা মডেল পরিবারের মতো৷ ফলস্বরূপ, CodeGemma মডেলগুলি স্কেলে দৃঢ় বোঝাপড়া এবং যুক্তির দক্ষতা বজায় রেখে সমাপ্তি এবং প্রজন্ম উভয় কাজেই অত্যাধুনিক কোড কার্যকারিতা অর্জন করে।
কোডজেমার 3টি রূপ রয়েছে:
- একটি 7B কোড পূর্বপ্রশিক্ষিত মডেল
- একটি 7B নির্দেশ-সুরিত কোড মডেল
- একটি 2B মডেল, বিশেষভাবে কোড ইনফিলিং এবং ওপেন-এন্ডেড জেনারেশনের জন্য প্রশিক্ষিত।
এই গাইড আপনাকে কোড কমপ্লিশন টাস্কের জন্য Flax এর সাথে CodeGemma মডেল ব্যবহার করে নিয়ে যাবে।
সেটআপ
1. CodeGemma-এর জন্য Kaggle অ্যাক্সেস সেট আপ করুন
এই টিউটোরিয়ালটি সম্পূর্ণ করার জন্য, আপনাকে প্রথমে Gemma সেটআপে সেটআপ নির্দেশাবলী অনুসরণ করতে হবে, যা আপনাকে নিম্নলিখিতগুলি কীভাবে করতে হবে তা দেখায়:
- kaggle.com- এ CodeGemma-এ অ্যাক্সেস পান।
- CodeGemma মডেল চালানোর জন্য পর্যাপ্ত সম্পদ সহ একটি Colab রানটাইম বেছে নিন ( T4 GPU-তে অপর্যাপ্ত মেমরি আছে, পরিবর্তে TPU v2 ব্যবহার করুন )।
- একটি Kaggle ব্যবহারকারীর নাম এবং API কী তৈরি এবং কনফিগার করুন।
আপনি জেমা সেটআপ সম্পূর্ণ করার পরে, পরবর্তী বিভাগে যান, যেখানে আপনি আপনার Colab পরিবেশের জন্য পরিবেশের ভেরিয়েবল সেট করবেন।
2. পরিবেশ ভেরিয়েবল সেট করুন
KAGGLE_USERNAME
এবং KAGGLE_KEY
এর জন্য পরিবেশ ভেরিয়েবল সেট করুন। যখন "অ্যাক্সেস মঞ্জুর করুন?" বার্তা, গোপন অ্যাক্সেস প্রদান করতে সম্মত হন।
import os
from google.colab import userdata # `userdata` is a Colab API.
os.environ["KAGGLE_USERNAME"] = userdata.get('KAGGLE_USERNAME')
os.environ["KAGGLE_KEY"] = userdata.get('KAGGLE_KEY')
3. gemma
লাইব্রেরি ইনস্টল করুন
ফ্রি Colab হার্ডওয়্যার ত্বরণ বর্তমানে এই নোটবুক চালানোর জন্য অপর্যাপ্ত । আপনি যদি Colab Pay As You Go বা Colab Pro ব্যবহার করেন, তাহলে Edit > Notebook সেটিংস > A100 GPU বেছে নিন > হার্ডওয়্যার অ্যাক্সিলারেশন চালু করতে সেভ করুন -এ ক্লিক করুন।
এর পরে, আপনাকে github.com/google-deepmind/gemma
থেকে Google DeepMind gemma
লাইব্রেরি ইনস্টল করতে হবে। আপনি যদি "পিপের নির্ভরতা সমাধানকারী" সম্পর্কে একটি ত্রুটি পান তবে আপনি সাধারণত এটি উপেক্ষা করতে পারেন।
pip install -q git+https://github.com/google-deepmind/gemma.git
4. লাইব্রেরি আমদানি করুন
এই নোটবুকটি জেমা (যা তার নিউরাল নেটওয়ার্ক স্তরগুলি তৈরি করতে ফ্ল্যাক্স ব্যবহার করে), এবং সেন্টেন্সপিস (টোকেনাইজেশনের জন্য) ব্যবহার করে।
import os
from gemma import params as params_lib
from gemma import sampler as sampler_lib
from gemma import transformer as transformer_lib
import sentencepiece as spm
CodeGemma মডেল লোড করুন
kagglehub.model_download
দিয়ে CodeGemma মডেল লোড করুন, যা তিনটি আর্গুমেন্ট নেয়:
-
handle
: কাগল থেকে মডেল হ্যান্ডেল -
path
: (ঐচ্ছিক স্ট্রিং) স্থানীয় পথ -
force_download
: (ঐচ্ছিক বুলিয়ান) মডেলটিকে পুনরায় ডাউনলোড করতে বাধ্য করে
GEMMA_VARIANT = '2b-pt' # @param ['2b-pt', '7b-it', '7b-pt', '1.1-2b-pt', '1.1-7b-it'] {type:"string"}
import kagglehub
GEMMA_PATH = kagglehub.model_download(f'google/codegemma/flax/{GEMMA_VARIANT}')
Warning: Looks like you're using an outdated `kagglehub` version, please consider updating (latest version: 0.2.7) Downloading from https://www.kaggle.com/api/v1/models/google/codegemma/flax/2b-pt/3/download... 100%|██████████| 3.67G/3.67G [00:22<00:00, 173MB/s] Extracting model files...
print('GEMMA_PATH:', GEMMA_PATH)
GEMMA_PATH: /root/.cache/kagglehub/models/google/codegemma/flax/2b-pt/3
মডেল ওজন এবং টোকেনাইজারের অবস্থান পরীক্ষা করুন, তারপর পাথ ভেরিয়েবল সেট করুন। টোকেনাইজার ডিরেক্টরিটি মূল ডিরেক্টরিতে থাকবে যেখানে আপনি মডেলটি ডাউনলোড করেছেন, যখন মডেলের ওজনগুলি একটি সাব-ডিরেক্টরিতে থাকবে। উদাহরণ স্বরূপ:
-
spm.model
টোকেনাইজার ফাইলটি/LOCAL/PATH/TO/codegemma/flax/2b-pt/3
এ থাকবে - মডেল চেকপয়েন্ট
/LOCAL/PATH/TO/codegemma/flax/2b-pt/3/2b-pt
থাকবে
CKPT_PATH = os.path.join(GEMMA_PATH, GEMMA_VARIANT[-5:])
TOKENIZER_PATH = os.path.join(GEMMA_PATH, 'spm.model')
print('CKPT_PATH:', CKPT_PATH)
print('TOKENIZER_PATH:', TOKENIZER_PATH)
CKPT_PATH: /root/.cache/kagglehub/models/google/codegemma/flax/2b-pt/3/2b-pt TOKENIZER_PATH: /root/.cache/kagglehub/models/google/codegemma/flax/2b-pt/3/spm.model
নমুনা/অনুমান সম্পাদন করুন
gemma.params.load_and_format_params
পদ্ধতিতে কোডজেমা মডেল চেকপয়েন্ট লোড এবং ফর্ম্যাট করুন:
params = params_lib.load_and_format_params(CKPT_PATH)
কোডজেমা টোকেনাইজার লোড করুন, sentencepiece.SentencePieceProcessor
ব্যবহার করে নির্মিত। সেন্টেন্সপিসপ্রসেসর :
vocab = spm.SentencePieceProcessor()
vocab.Load(TOKENIZER_PATH)
True
CodeGemma মডেল চেকপয়েন্ট থেকে স্বয়ংক্রিয়ভাবে সঠিক কনফিগারেশন লোড করতে, gemma.transformer.TransformerConfig
ব্যবহার করুন। cache_size
আর্গুমেন্ট হল কোডজেমা Transformer
ক্যাশে সময়ের ধাপের সংখ্যা। তারপরে, কোডজেমা মডেলটিকে model_2b
হিসাবে gemma.transformer.Transformer
(যা flax.linen.Module
থেকে উত্তরাধিকারসূত্রে পাওয়া যায়) দিয়ে ইনস্ট্যান্টিয়েট করুন।
transformer_config = transformer_lib.TransformerConfig.from_params(
params,
cache_size=1024
)
transformer = transformer_lib.Transformer(config=transformer_config)
gemma.sampler.Sampler
দিয়ে একটি sampler
তৈরি করুন। এটি কোডজেমা মডেল চেকপয়েন্ট এবং টোকেনাইজার ব্যবহার করে।
sampler = sampler_lib.Sampler(
transformer=transformer,
vocab=vocab,
params=params['transformer']
)
ফিল-ইন-দ্য-মিডল (ফিম) টোকেনগুলিকে উপস্থাপন করতে কিছু ভেরিয়েবল তৈরি করুন এবং প্রম্পট এবং জেনারেট আউটপুট ফর্ম্যাট করতে কিছু সহায়ক ফাংশন তৈরি করুন।
উদাহরণস্বরূপ, আসুন নিম্নলিখিত কোডটি দেখি:
def function(string):
assert function('asdf') == 'fdsa'
আমরা function
পূরণ করতে চাই যাতে দাবীটি True
হয়। এই ক্ষেত্রে, উপসর্গ হবে:
"def function(string):\n"
এবং প্রত্যয়টি হবে:
"assert function('asdf') == 'fdsa'"
তারপরে আমরা এটিকে প্রম্পটে PREFIX-SUFFIX-MIDDLE হিসাবে ফর্ম্যাট করি (মাঝখানের বিভাগটি যেটি পূরণ করতে হবে তা সর্বদা প্রম্পটের শেষে থাকে):
"<|fim_prefix|>def function(string):\n<|fim_suffix|>assert function('asdf') == 'fdsa'<|fim_middle|>"
# In the context of a code editor,
# the cursor is the location where the text will be inserted
BEFORE_CURSOR = "<|fim_prefix|>"
AFTER_CURSOR = "<|fim_suffix|>"
AT_CURSOR = "<|fim_middle|>"
FILE_SEPARATOR = "<|file_separator|>"
def format_completion_prompt(before, after):
print(f"\nORIGINAL PROMPT:\n{before}{after}")
prompt = f"{BEFORE_CURSOR}{before}{AFTER_CURSOR}{after}{AT_CURSOR}"
print(f"\nFORMATTED PROMPT:\n{repr(prompt)}")
return prompt
def format_generated_output(before, after, output):
print(f"\nGENERATED OUTPUT:\n{repr(output)}")
formatted_output = f"{before}{output.replace(FILE_SEPARATOR, '')}{after}"
print(f"\nFILL-IN COMPLETION:\n{formatted_output}")
return formatted_output
একটি প্রম্পট তৈরি করুন এবং অনুমান সঞ্চালন করুন। টেক্সটের before
প্রিফিক্স এবং টেক্সটের after
প্রত্যয় নির্দিষ্ট করুন এবং হেল্পার ফাংশন format_completion prompt
ব্যবহার করে ফর্ম্যাট করা প্রম্পট তৈরি করুন।
আপনি total_generation_steps
(একটি প্রতিক্রিয়া তৈরি করার সময় সঞ্চালিত পদক্ষেপের সংখ্যা - এই উদাহরণ হোস্ট মেমরি সংরক্ষণের জন্য 100
ব্যবহার করে) পরিবর্তন করতে পারেন।
before = "def function(string):\n"
after = "assert function('asdf') == 'fdsa'"
prompt = format_completion_prompt(before, after)
output = sampler(
[prompt],
total_generation_steps=100,
).text
formatted_output = format_generated_output(before, after, output[0])
ORIGINAL PROMPT: def function(string): assert function('asdf') == 'fdsa' FORMATTED PROMPT: "<|fim_prefix|>def function(string):\n<|fim_suffix|>assert function('asdf') == 'fdsa'<|fim_middle|>" GENERATED OUTPUT: ' return string[::-1]\n\n<|file_separator|>' FILL-IN COMPLETION: def function(string): return string[::-1] assert function('asdf') == 'fdsa'
before = "import "
after = """if __name__ == "__main__":\n sys.exit(0)"""
prompt = format_completion_prompt(before, after)
output = sampler(
[prompt],
total_generation_steps=100,
).text
formatted_output = format_generated_output(before, after, output[0])
ORIGINAL PROMPT: import if __name__ == "__main__": sys.exit(0) FORMATTED PROMPT: '<|fim_prefix|>import <|fim_suffix|>if __name__ == "__main__":\n sys.exit(0)<|fim_middle|>' GENERATED OUTPUT: 'sys\n<|file_separator|>' FILL-IN COMPLETION: import sys if __name__ == "__main__": sys.exit(0)
before = """import numpy as np
def reflect(matrix):
# horizontally reflect a matrix
"""
after = ""
prompt = format_completion_prompt(before, after)
output = sampler(
[prompt],
total_generation_steps=100,
).text
formatted_output = format_generated_output(before, after, output[0])
ORIGINAL PROMPT: import numpy as np def reflect(matrix): # horizontally reflect a matrix FORMATTED PROMPT: '<|fim_prefix|>import numpy as np\ndef reflect(matrix):\n # horizontally reflect a matrix\n<|fim_suffix|><|fim_middle|>' GENERATED OUTPUT: ' return np.flip(matrix, axis=1)\n<|file_separator|>' FILL-IN COMPLETION: import numpy as np def reflect(matrix): # horizontally reflect a matrix return np.flip(matrix, axis=1)
আরও জানুন
- আপনি GitHub-এ Google DeepMind
gemma
লাইব্রেরি সম্পর্কে আরও জানতে পারেন, যেটিতে আপনি এই টিউটোরিয়ালটিতে ব্যবহার করেছেন এমন মডিউলগুলির ডকস্ট্রিং রয়েছে, যেমনgemma.params
,gemma.transformer
, এবংgemma.sampler
। - নিম্নলিখিত লাইব্রেরিগুলির নিজস্ব ডকুমেন্টেশন সাইট রয়েছে: কোর JAX , Flax , এবং Orbax ৷
-
sentencepiece
টোকেনাইজার/ডিটোকেনাইজার ডকুমেন্টেশনের জন্য, Google-এরsentencepiece
GitHub রেপো দেখুন। -
kagglehub
ডকুমেন্টেশনের জন্য, Kaggle এরkagglehub
GitHub রেপোতেREADME.md
দেখুন। - Google ক্লাউড ভার্টেক্স এআই-এর সাথে জেমা মডেলগুলি কীভাবে ব্যবহার করবেন তা শিখুন।
- আপনি যদি Google ক্লাউড TPUs (v3-8 এবং নতুন) ব্যবহার করেন, তাহলে সর্বশেষ
jax[tpu]
প্যাকেজেও আপডেট করতে ভুলবেন না (!pip install -U jax[tpu] -f https://storage.googleapis.com/jax-releases/libtpu_releases.html
), রানটাইম পুনরায় আরম্ভ করুন, এবংjax
এবংjaxlib
সংস্করণ মিলছে কিনা তা পরীক্ষা করুন (!pip list | grep jax
)। এটিRuntimeError
প্রতিরোধ করতে পারে যাjaxlib
এবংjax
সংস্করণের অমিলের কারণে হতে পারে। আরও JAX ইনস্টলেশন নির্দেশাবলীর জন্য, JAX ডক্স দেখুন।