CodeGemma এবং KerasNLP এর সাথে AI সহায়তাকারী প্রোগ্রামিং

ai.google.dev-এ দেখুন Google Colab-এ চালান GitHub-এ উৎস দেখুন

ওভারভিউ

CodeGemma হল Gemma-এর একটি বৈকল্পিক যা কোডিং কাজের জন্য সূক্ষ্ম-সুরক্ষিত। এই টিউটোরিয়ালটি কেরাস কোডজেমা কুইকস্টার্টের উপর তৈরি করে এবং কোডজেমা আপনার প্রোগ্রামিং কাজগুলিতে সহায়তা করতে পারে এমন আরও উপায় আপনাকে দেখায়।

সেটআপ

CodeGemma অ্যাক্সেস পান

এই টিউটোরিয়ালটি সম্পূর্ণ করতে, আপনাকে প্রথমে Gemma সেটআপে সেটআপ নির্দেশাবলী সম্পূর্ণ করতে হবে। জেমা সেটআপ নির্দেশাবলী আপনাকে দেখায় যে কীভাবে নিম্নলিখিতগুলি করতে হবে:

  • kaggle.com- এ Gemma-এ অ্যাক্সেস পান।
  • Gemma 7B মডেল চালানোর জন্য পর্যাপ্ত সম্পদ সহ একটি Colab রানটাইম বেছে নিন।
  • একটি Kaggle ব্যবহারকারীর নাম এবং API কী তৈরি এবং কনফিগার করুন।

আপনি জেমা সেটআপ সম্পূর্ণ করার পরে, পরবর্তী বিভাগে যান, যেখানে আপনি আপনার Colab পরিবেশের জন্য পরিবেশের ভেরিয়েবল সেট করবেন।

রানটাইম নির্বাচন করুন

CodeGemma 7B মডেল চালানোর জন্য, আপনার একটি পেইড Colab Pro প্ল্যান থাকতে হবে যা A100 GPU সহ রানটাইম প্রদান করে।

  1. Colab উইন্ডোর উপরের ডানদিকে, ▾ ( অতিরিক্ত সংযোগ বিকল্প ) নির্বাচন করুন।
  2. রানটাইম পরিবর্তন নির্বাচন করুন।
  3. হার্ডওয়্যার এক্সিলারেটরের অধীনে, A100 GPU নির্বাচন করুন।

আপনার API কী কনফিগার করুন

Gemma ব্যবহার করতে, আপনাকে অবশ্যই আপনার Kaggle ব্যবহারকারীর নাম এবং একটি Kaggle API কী প্রদান করতে হবে।

একটি Kaggle API কী তৈরি করতে, আপনার Kaggle ব্যবহারকারী প্রোফাইলের অ্যাকাউন্ট ট্যাবে যান এবং নতুন টোকেন তৈরি করুন নির্বাচন করুন। এটি আপনার API শংসাপত্র ধারণকারী একটি kaggle.json ফাইলের ডাউনলোডকে ট্রিগার করবে৷

Colab-এ, বাম ফলকে সিক্রেটস (🔑) নির্বাচন করুন এবং আপনার Kaggle ব্যবহারকারীর নাম এবং Kaggle API কী যোগ করুন। KAGGLE_USERNAME নামে আপনার ব্যবহারকারীর নাম এবং KAGGLE_KEY নামের অধীনে আপনার API কী সংরক্ষণ করুন।

পরিবেশের ভেরিয়েবল সেট করুন

KAGGLE_USERNAME এবং KAGGLE_KEY এর জন্য পরিবেশ ভেরিয়েবল সেট করুন।

import os
from google.colab import userdata

os.environ["KAGGLE_USERNAME"] = userdata.get('KAGGLE_USERNAME')
os.environ["KAGGLE_KEY"] = userdata.get('KAGGLE_KEY')

নির্ভরতা ইনস্টল করুন

pip install -q -U keras-nlp

একটি ব্যাকএন্ড নির্বাচন করুন

কেরাস হল একটি উচ্চ-স্তরের, মাল্টি-ফ্রেমওয়ার্ক ডিপ লার্নিং API যা সরলতা এবং ব্যবহারের সহজতার জন্য ডিজাইন করা হয়েছে। কেরাস 3 ব্যবহার করে, আপনি তিনটি ব্যাকএন্ডের একটিতে ওয়ার্কফ্লো চালাতে পারেন: টেনসরফ্লো, জেএএক্স, বা পাইটর্চ।

এই টিউটোরিয়ালের জন্য, JAX-এর জন্য ব্যাকএন্ড কনফিগার করুন।

os.environ["KERAS_BACKEND"] = "jax"  # Or "tensorflow" or "torch".

প্যাকেজ আমদানি করুন

কেরাস এবং কেরাসএনএলপি আমদানি করুন।

import keras_nlp
import keras

# Run at half precision.
keras.config.set_floatx("bfloat16")

CodeGemma 7B মডেলের উদাহরণ

এই বিভাগে কোডিং কাজগুলিতে সাহায্য করার জন্য প্রাক-প্রশিক্ষিত 7B কোডজেমা মডেল ব্যবহারের উদাহরণগুলি কভার করে৷

মডেল লোড করুন

KerasNLP তিনটি কোডজেমা ভেরিয়েন্টের (2B এবং 7B প্রাক-প্রশিক্ষিত (PT) এবং 7B নির্দেশ-টিউনড (IT)) GemmaCausalLM ব্যবহার করে, কার্যকারণ ভাষার মডেলিংয়ের জন্য একটি এন্ড-টু-এন্ড জেমা মডেল ব্যবহার করে। একটি কার্যকারণ ভাষা মডেল পূর্ববর্তী টোকেনগুলির উপর ভিত্তি করে পরবর্তী টোকেনের পূর্বাভাস দেয়।

এই উদাহরণের জন্য, from_preset পদ্ধতি ব্যবহার করে code_gemma_7b_en মডেলটি লোড করুন।

gemma_lm_7b = keras_nlp.models.GemmaCausalLM.from_preset("code_gemma_7b_en")
Downloading from https://www.kaggle.com/api/v1/models/keras/codegemma/keras/code_gemma_7b_en/1/download/config.json...
100%|██████████| 556/556 [00:00<00:00, 790kB/s]
Downloading from https://www.kaggle.com/api/v1/models/keras/codegemma/keras/code_gemma_7b_en/1/download/model.weights.h5...
100%|██████████| 15.9G/15.9G [02:39<00:00, 107MB/s]
Downloading from https://www.kaggle.com/api/v1/models/keras/codegemma/keras/code_gemma_7b_en/1/download/tokenizer.json...
100%|██████████| 401/401 [00:00<00:00, 587kB/s]
Downloading from https://www.kaggle.com/api/v1/models/keras/codegemma/keras/code_gemma_7b_en/1/download/assets/tokenizer/vocabulary.spm...
100%|██████████| 4.04M/4.04M [00:00<00:00, 16.4MB/s]
gemma_lm_7b.summary()

from_preset পদ্ধতিটি একটি প্রিসেট আর্কিটেকচার এবং ওজন থেকে মডেলটিকে ইনস্ট্যান্টিয়েট করে।

মাল্টি-লাইন FIM এর সাথে কোড সমাপ্তি

PT CodeGemma মডেলগুলিকে কোড ইনফিলিং কাজগুলিতে প্রশিক্ষণ দেওয়া হয়। এই বিভাগটি এমন উদাহরণগুলি দেখায় যেগুলি আশেপাশের প্রসঙ্গের উপর ভিত্তি করে নির্দিষ্ট কার্সার অবস্থানে কোড স্বয়ংক্রিয়ভাবে পূরণ করতে CodeGemma-এর মাল্টি-লাইন ফিল-ইন দ্য-মিডল (FIM) ক্ষমতা ব্যবহার করে৷

প্রথম ধাপ হিসেবে, ধ্রুবক এবং একটি প্রম্পট ফরম্যাটিং সহায়ক ফাংশন সংজ্ঞায়িত করুন।

# Formatting control tokens to specify cursor location
BEFORE_CURSOR = "<|fim_prefix|>"
AFTER_CURSOR = "<|fim_suffix|>"
AT_CURSOR = "<|fim_middle|>"
FILE_SEPARATOR = "<|file_separator|>"

# Define model stop tokens
END_TOKEN = gemma_lm_7b.preprocessor.tokenizer.end_token
stop_tokens = (BEFORE_CURSOR, AFTER_CURSOR, AT_CURSOR, FILE_SEPARATOR, END_TOKEN)
stop_token_ids = tuple(gemma_lm_7b.preprocessor.tokenizer.token_to_id(x) for x in stop_tokens)

def format_completion_prompt(before, after):
    return f"{BEFORE_CURSOR}{before}{AFTER_CURSOR}{after}{AT_CURSOR}"

উদাহরণ 1 - অনুপস্থিত শর্ত সন্নিবেশ

ফিবোনাচি সিকোয়েন্স তৈরি করার জন্য নিচের উদাহরণ কোডটি সঠিকভাবে কার্যকর হবে না যদি n=1 :

def fibonacci(n: int) -> int:
  if n == 0:
    return 0
  # The cursor is right before the e in the following line
  else:
    return fibonacci(n - 1) + fibonacci(n - 2)

ধরে নিলাম যে কার্সারটি লাইন 4 এর শুরুতে (যেখানে else ক্লজ রয়েছে), তারপর কার্সারের আগে এবং পরে বিষয়বস্তু হল:

before = """def fibonacci(n: int) -> int:\n  if n == 0:\n    return 0\n""" # Mind the spaces!
after = """\n  else:\n    return fibonacci(n - 1) + fibonacci(n-2)\n"""
prompt = format_completion_prompt(before, after)
print(prompt)
<|fim_prefix|>def fibonacci(n: int) -> int:
  if n == 0:
    return 0
<|fim_suffix|>
  else:
    return fibonacci(n - 1) + fibonacci(n-2)
<|fim_middle|>

প্রম্পট চালান।

print(gemma_lm_7b.generate(prompt, stop_token_ids=stop_token_ids, max_length=128))
<|fim_prefix|>def fibonacci(n: int) -> int:
  if n == 0:
    return 0
<|fim_suffix|>
  else:
    return fibonacci(n - 1) + fibonacci(n-2)
<|fim_middle|>elif n == 1:
    return 1<|file_separator|>

মডেলটি কার্সারের অবস্থানে n=1 এর জন্য সঠিক elif শর্ত সন্নিবেশ করায়।

উদাহরণ 2 - সম্পূর্ণ ডিএফএস ট্রাভার্সাল অ্যালগরিদম

একটি গভীরতা-প্রথম অনুসন্ধান (DFS) ট্রি ট্রাভার্সাল অ্যালগরিদমের জন্য স্বয়ংক্রিয়-সম্পূর্ণ কোড৷

before = """void dfs(node* root) {
  if (root->left) {
    dfs(root->left);
  }"""
after = """\nprintf("%d", root->value);
}"""
prompt = format_completion_prompt(before, after)
print(prompt)
<|fim_prefix|>void dfs(node* root) {
  if (root->left) {
    dfs(root->left);
  }<|fim_suffix|>
printf("%d", root->value);
}<|fim_middle|>

প্রম্পট চালান।

print(gemma_lm_7b.generate(prompt, stop_token_ids=stop_token_ids, max_length=128))
<|fim_prefix|>void dfs(node* root) {
  if (root->left) {
    dfs(root->left);
  }<|fim_suffix|>
printf("%d", root->value);
}<|fim_middle|>
  if (root->right) {
    dfs(root->right);
  }<|file_separator|>

কোড প্রজন্ম

কোড ইনফিলিং ছাড়াও, CodeGemma 7B PT মডেলটি প্রাকৃতিক ভাষার দেহের উপরও প্রশিক্ষিত। আপনি কোড তৈরি করতে মডেলকে অনুরোধ করতে এটি ব্যবহার করতে পারেন।

generation_prompt= """Write a rust function to identify non-prime numbers.
Examples:
>>> is_not_prime(2)
False
>>> is_not_prime(10)
True
pub fn is_not_prime(n: i32) -> bool {"""
print(gemma_lm_7b.generate(generation_prompt, max_length=500))
Write a rust function to identify non-prime numbers.
Examples:
>>> is_not_prime(2)
False
>>> is_not_prime(10)
True
pub fn is_not_prime(n: i32) -> bool {
    if n <= 1 {
        return true;
    }
    for i in 2..n {
        if n % i == 0 {
            return true;
        }
    }
    false
}

7B আইটি মডেলের উদাহরণ

এই বিভাগটি আরও উন্নত কোডিং কাজের জন্য CodeGemma 7B নির্দেশ-টিউনড মডেল ব্যবহার করে। CodeGemma 7B IT মডেলটি CodeGemma 7B PT মডেল থেকে গৃহীত হয়েছে কোডে তত্ত্বাবধানে সূক্ষ্ম-টিউনিংয়ের মাধ্যমে এবং রিইনফোর্সমেন্ট লার্নিং উইথ হিউম্যান ফিডব্যাকের মাধ্যমে। এই বিভাগে ওপেন-এন্ডেড প্রজন্মের জন্য এই মডেলটি ব্যবহার করার উদাহরণগুলি কভার করে৷

আইটি মডেল লোড করুন

from_preset পদ্ধতি ব্যবহার করে code_gemma_instruct_7b_en মডেলটি লোড করুন।

gemma_lm_7b_it = keras_nlp.models.GemmaCausalLM.from_preset("code_gemma_instruct_7b_en")
gemma_lm_7b_it.summary()
Downloading from https://www.kaggle.com/api/v1/models/keras/codegemma/keras/code_gemma_instruct_7b_en/1/download/config.json...
100%|██████████| 556/556 [00:00<00:00, 754kB/s]
Downloading from https://www.kaggle.com/api/v1/models/keras/codegemma/keras/code_gemma_instruct_7b_en/1/download/model.weights.h5...
100%|██████████| 15.9G/15.9G [03:18<00:00, 86.2MB/s]
Downloading from https://www.kaggle.com/api/v1/models/keras/codegemma/keras/code_gemma_instruct_7b_en/1/download/tokenizer.json...
100%|██████████| 401/401 [00:00<00:00, 593kB/s]
Downloading from https://www.kaggle.com/api/v1/models/keras/codegemma/keras/code_gemma_instruct_7b_en/1/download/assets/tokenizer/vocabulary.spm...
100%|██████████| 4.04M/4.04M [00:00<00:00, 16.8MB/s]

আইটি মডেলগুলিকে একটি নির্দিষ্ট ফরম্যাটার দিয়ে প্রশিক্ষিত করা হয় যা ভূমিকা নির্দেশ করতে এবং কথোপকথনের মোড়কে চিত্রিত করতে অতিরিক্ত তথ্য সহ সমস্ত নির্দেশ টিউনিং উদাহরণ টীকা করে।

প্রথম ধাপ হিসেবে, ধ্রুবক এবং একটি প্রম্পট ফরম্যাটিং সহায়ক ফাংশন সংজ্ঞায়িত করুন।

# Formatting control tokens for instruction tuning
START_OF_TURN_USER = "<start_of_turn>user"
END_OF_TURN = "<end_of_turn>"
START_OF_TURN_MODEL = "<start_of_turn>model"

# Formatting helper function
def format_instruction_prompt(context):
    return f"{START_OF_TURN_USER}\n{context}{END_OF_TURN}\n{START_OF_TURN_MODEL}\n"

কোড অনুবাদ

context1 = """
You are an experienced C and Python programmer. Convert the following Python code into C.
```python
def factorial(n):
    result = 1
    for i in range(2, n + 1):
        result *= i
    return result
```\n"""

প্রম্পট ফরম্যাট করুন।

prompt1 = format_instruction_prompt(context1)
print(prompt1)
<start_of_turn>user

You are an experienced C and Python programmer. Convert the following Python code into C.

```python
def factorial(n):
    result = 1
    for i in range(2, n + 1):
        result *= i
    return result
```
<end_of_turn>
<start_of_turn>model

প্রম্পট চালান।

print(gemma_lm_7b_it.generate(prompt1, max_length=500))
<start_of_turn>user

You are an experienced C and Python programmer. Convert the following Python code into C.

```python
def factorial(n):
    result = 1
    for i in range(2, n + 1):
        result *= i
    return result
```
<end_of_turn>
<start_of_turn>model
Here is the C code equivalent of the Python code:

```c
int factorial(int n) {
  int result = 1;
  for (int i = 2; i <= n; i++) {
    result *= i;
  }
  return result;
}
```

Here is a breakdown of the changes:

* The function is declared with the `int` return type, as in Python.
* The `for` loop is converted to a `for` loop with an `int` variable `i` initialized to 2 and incremented by 1 in each iteration.
* The `range` function is replaced with a simple loop that iterates from 2 to `n` (inclusive).
* The `result *= i` statement is used to multiply `result` by `i` in each iteration.
* The `return` statement is used to return the final value of `result`.

কোড দুর্বলতা সনাক্তকরণ

context2 = """
You are an experienced C++ programmer hunting for vulnerable code. Is the following code vulnerable? Explain your reasoning.
```cpp
int i;
unsigned int numWidgets;
Widget **WidgetList;

numWidgets = GetUntrustedSizeValue();
if ((numWidgets == 0) || (numWidgets > MAX_NUM_WIDGETS)) {
    ExitError("Incorrect number of widgets requested!");
}
WidgetList = (Widget **) malloc(numWidgets * sizeof(Widget *));
printf("WidgetList ptr=%p\n", WidgetList);
for (i = 0; i < numWidgets; i++) {
    WidgetList[i] = InitializeWidget();
}
WidgetList[numWidgets] = NULL;
showWidgets(WidgetList);
```\n"""

প্রম্পট ফরম্যাট করুন।

prompt2 = format_instruction_prompt(context2)
print(prompt2)
<start_of_turn>user

You are an experienced C++ programmer hunting for vulnerable code. Is the following code vulnerable? Explain your reasoning.

```cpp
int i;
unsigned int numWidgets;
Widget **WidgetList;

numWidgets = GetUntrustedSizeValue();
if ((numWidgets == 0) || (numWidgets > MAX_NUM_WIDGETS)) {
    ExitError("Incorrect number of widgets requested!");
}
WidgetList = (Widget **) malloc(numWidgets * sizeof(Widget *));
printf("WidgetList ptr=%p
", WidgetList);
for (i = 0; i < numWidgets; i++) {
    WidgetList[i] = InitializeWidget();
}
WidgetList[numWidgets] = NULL;
showWidgets(WidgetList);
```
<end_of_turn>
<start_of_turn>model
print(gemma_lm_7b_it.generate(prompt2, max_length=1000))
<start_of_turn>user

You are an experienced C++ programmer hunting for vulnerable code. Is the following code vulnerable? Explain your reasoning.

```cpp
int i;
unsigned int numWidgets;
Widget **WidgetList;

numWidgets = GetUntrustedSizeValue();
if ((numWidgets == 0) || (numWidgets > MAX_NUM_WIDGETS)) {
    ExitError("Incorrect number of widgets requested!");
}
WidgetList = (Widget **) malloc(numWidgets * sizeof(Widget *));
printf("WidgetList ptr=%p
", WidgetList);
for (i = 0; i < numWidgets; i++) {
    WidgetList[i] = InitializeWidget();
}
WidgetList[numWidgets] = NULL;
showWidgets(WidgetList);
```
<end_of_turn>
<start_of_turn>model
Yes, the code is vulnerable to a memory access error.

**Reasoning:**

* The code allocates memory for `WidgetList` using `malloc` based on the value of `numWidgets`.
* However, the loop iterates from `0` to `numWidgets`, which is one element beyond the allocated memory.
* This means that accessing `WidgetList[numWidgets]` will result in a memory access error, as it is outside the bounds of the allocated memory.

**Example of Memory Access Error:**

When `numWidgets` is 5, the code allocates memory for `WidgetList` as follows:

```
WidgetList = (Widget **) malloc(5 * sizeof(Widget *));
```

The loop iterates from 0 to 4, accessing the following elements:

* `WidgetList[0]`
* `WidgetList[1]`
* `WidgetList[2]`
* `WidgetList[3]`
* `WidgetList[4]`

However, the code then attempts to access `WidgetList[5]`, which is outside the allocated memory range. This will result in a memory access error.

**Solution:**

To resolve this vulnerability, the loop should be modified to iterate from 0 to `numWidgets - 1`:

```cpp
for (i = 0; i < numWidgets - 1; i++) {
    WidgetList[i] = InitializeWidget();
}
```

This ensures that the loop does not access elements beyond the allocated memory range.

মডেলটি কোডে একটি সম্ভাব্য দুর্বলতা সনাক্ত করে এবং এটি প্রশমিত করার জন্য কোড পরিবর্তনগুলি প্রদান করে৷

সারসংক্ষেপ

এই টিউটোরিয়ালটি আপনাকে বিভিন্ন কোডিং কাজের জন্য CodeGemma ব্যবহার করে নিয়ে গেছে। CodeGemma সম্পর্কে আরও জানতে: