コード生成LLM mistralai/mamba-codestral-7B-v0.1 を試してみた

# やばいコード生成LLMでてきた

なにがやばいって、7Bクラスで HumanEval 75% ですよ。これは相当な高得点じゃないでしょうか。

このモデルは Transformer モデルではなく Mamba モデルを採用していて、
Transformer ベースの SOTA モデルと同等のパフォーマンスが可能になってそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752825/bc4a1d3e-4f36-6a58-f2cc-d59c8e0b9367.png)

ということでお試ししてみました。

## お試しした環境

CPU: 12世代 i7
RAM: 64GB
OS: Windows(WSL Ubuntu)
GPU:A5000

## 動画にもまとめました

お試しした内容を動画にもまとめています

<iframe width="1166" height="656" src="https://www.youtube.com/embed/Q1guhIFkrus" title="【最新LLM紹介】 コード生成LLM &quot;mistralai/mamba-codestral-7B-v0.1&quot; の実力" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## パッケージのインストール

```
pip install mistral_inference
pip install packaging mamba-ssm causal-conv1d transformers
```

## モデルのダウンロード

まずモデルのページにいって、Permissionを得ます

https://huggingface.co/mistralai/mamba-codestral-7B-v0.1

次に以下のように、コードをつかってダウンロードします。

ここでは Windows PC の Dドライブに落としました。
WSLを使っているので  `/mnt` のように指定しています。

```python
mistral_models_path = Path.home().joinpath('/mnt/d/mistral_models', 'mamba-codestral-7B-v0.1')

mistral_models_path.mkdir(parents=True, exist_ok=True)

snapshot_download(
    repo_id="mistralai/mamba-codestral-7B-v0.1",
    local_dir=mistral_models_path,
    token="ダウンロード許可を得たユーザーのHuggingFaceのトークンをここにいれる"
)

```

## コンソールチャットを実行

mistral_inference パッケージが仮想環境にインストールされていると、以下のように `mistral-chat` コマンドが使えるようになります。

モデル名を指定して起動します。

```shell
mistral-chat /mnt/d/mistral_models/mamba-codestral-7B-v0.1 --instruct --max_tokens 1024
```

私の環境では、モデル読み込んでプロンプトでるまで 5分くらいかかりました。


## お試しした内容

### Pythonプログラムを書くよう命令する

「1から1000までのすべての数の和を計算するPythonプログラムを書きなさい。」

````
mistral-chat /mnt/d/mistral_models/mamba-codestral-7B-v0.1 --instruct --max_tokens 1024
Prompt: Write a Python program to calculate the sum of all numbers from 1 to 1000.
Here is a simple Python program that calculates the sum of all numbers from 1 to 1000:

```python
sum = 0
for i in range(1, 1001):
    sum += i
print(sum)
```

This program uses a for loop to iterate over each number from 1 to 1000. In each iteration, it adds the current number to the sum. After the loop finishes, it prints the sum.
=====================

````

 1から100までのすべての偶数を表示するPython関数を作りなさい

````
Prompt: Create a Python function that prints all even numbers between 1 and 100.
def print_even_numbers():
    for i in range(1, 101):
        if i % 2 == 0:
            print(i)
=====================
````

「第10項までのフィボナッチ数列を生成するPythonスクリプトを書きなさい。」

````
Prompt: Write a Python script to generate the Fibonacci sequence up to the 10th term.
def fibonacci(n):
    a, b = 0, 1
    for i in range(n):
        print(a, end=' ')
        a, b = b, a + b

fibonacci(10)
=====================
````

「セ氏から華氏への変換」

````
Prompt: Create a Python function that converts Celsius to Fahrenheit.
def celsius_to_fahrenheit(celsius):
    return (celsius * 9/5) + 32
=====================

````

「指定された長さのランダムなパスワードを生成するPythonプログラムを書きなさい。」

````
Prompt: Write a Python program that generates a random password of a specified length.
import string
import random

def generate_password(length):
    characters = string.ascii_letters + string.digits + string.punctuation
    password = ''.join(random.choice(characters) for _ in range(length))
    return password

length = int(input("Enter the length of the password: "))
password = generate_password(length)
print("Generated password:", password)
=====================
````

「リストの中にある２番目におおきな数字」

````
Prompt: Implement a Python function that finds the second largest number in a list.
def second_largest(numbers):
    numbers = list(set(numbers))
    numbers.sort()
    return numbers[-2]

# Example usage:
numbers = [1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9]
print(second_largest(numbers))  # Output: 8
=====================
````

#### コードを補完させる



````
Prompt: def reverse_string(s):
def reverse_string(s):
    return s[::-1]

# Example usage:
s = "Hello, World!"
print(reverse_string(s))  # Output: "!dlroW ,olleH"
=====================
Prompt: def calculate_average(numbers):
def calculate_average(numbers):
    return sum(numbers) / len(numbers)

# Example usage:
numbers = [1, 2, 3, 4, 5]
print(calculate_average(numbers))  # Output: 3.0
=====================
````

````
Prompt: def flatten_list(nested_list):
def flatten_list(nested_list):
    flat_list = []
    for sublist in nested_list:
        for item in sublist:
            flat_list.append(item)
    return flat_list

# Example usage:
nested_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(flatten_list(nested_list))  # Output: [1, 2, 3, 4, 5, 6, 7, 8, 9]
=====================
````

````
Prompt: def calculate_bmi(weight,height):
def calculate_bmi(weight, height):
    bmi = weight / (height ** 2)
    return bmi

# Example usage:
weight = 70
height = 1.75
print(calculate_bmi(weight, height))  # Output: 23.157894736842106
=====================
````


````
Prompt: Write Python code to create an interactive chat using the Mistral LLM. The code should allow users to input messages and receive responses from the Mistral model in a continuous conversation loop.
To create an interactive chat using the Mistral LLM, you will need to install the `mistralai` package and provide your API key. You can install the package using pip:

```
pip install mistralai
```

Then, you can use the following Python code to create an interactive chat:

```python
import os
from mistralai.client import MistralClient
from mistralai.models.chat_completion import ChatMessage

# Set your Mistral API key as an environment variable
os.environ["MISTRAL_API_KEY"] = "your_api_key_here"

# Initialize the Mistral client
client = MistralClient()

# Define the model to use
model = "mistral-medium"

# Initialize an empty list to store the chat history
chat_history = []

# Start the conversation loop
while True:
    # Get user input
    user_message = input("You: ")

    # Add the user message to the chat history
    chat_history.append(ChatMessage(role="user", content=user_message))

    # Generate the assistant response
    response = client.chat(
        model=model,
        messages=chat_history,
    )

    # Get the assistant message from the response
    assistant_message = response.choices[0].message.content

    # Print the assistant message
    print("Assistant:", assistant_message)

    # Add the assistant message to the chat history
    chat_history.append(ChatMessage(role="assistant", content=assistant_message))
```

````

## まとめ

mamba-codestral-7B をファーストルック的にさわってみました。

また分かったことを順次追記していきたいとおもいます。

ひとまず次は、 [ChatStream.net](https://chatstream.net) にのせて、みんなにさわってもらえるようにしたいな～