Chuyển đến nội dung chính

Hướng dẫn DeepSeek-Coder-V2: Ví dụ, Cài đặt, Điểm chuẩn

DeepSeek-Coder-V2 là mô hình ngôn ngữ cho mã nguồn mở với hiệu năng sánh ngang GPT-4, Gemini 1.5 Pro, Claude 3 Opus, Llama 3 70B hoặc Codestral.
· 8 phút đọc

Khám phá cùng AI

Khi các trợ lý mã hóa bằng AI như GitHub Copilot ngày càng phổ biến trong giới lập trình, các lựa chọn mã nguồn mở cũng đang xuất hiện.

Một ví dụ đáng chú ý là DeepSeek-Coder-V2, một mô hình mã nguồn mở mạnh mẽ sử dụng các kỹ thuật máy học tiên tiến. Mô hình này được thiết kế riêng cho các tác vụ liên quan đến mã, mang lại hiệu năng có thể so sánh với GPT-4 trong việc sinh mã, hoàn thành mã và hiểu mã.

Trong bài viết này, tôi sẽ giải thích các tính năng và khả năng của DeepSeek-Coder-V2 và hướng dẫn bạn cách bắt đầu sử dụng công cụ này.

DeepSeek-Coder-V2 là gì?

DeepSeek-Coder-V2 là mô hình ngôn ngữ cho mã nguồn mở theo kiến trúc Mixture-of-Experts (MoE) có hiệu năng sánh ngang GPT-4 trên các tác vụ chuyên về mã. Được thiết kế để hỗ trợ lập trình viên, mô hình này mang đến một số điểm nổi bật:

  • Đa ngôn ngữ: Được huấn luyện trên cả mã và ngôn ngữ tự nhiên bằng nhiều ngôn ngữ, bao gồm tiếng Anh và tiếng Trung, giúp linh hoạt cho các đội phát triển toàn cầu.
  • Đa dụng: Hỗ trợ phạm vi rộng hơn 338 ngôn ngữ lập trình, đáp ứng đa dạng môi trường và nhu cầu mã hóa.
  • Quy mô lớn: Tiền huấn luyện trên hàng nghìn tỷ token từ dữ liệu mã và văn bản, giúp tăng cường khả năng hiểu và sinh mã trong nhiều kịch bản.
  • Nhiều kích cỡ: Có nhiều kích thước mô hình để lập trình viên chọn lựa phù hợp với tài nguyên tính toán và yêu cầu dự án.

Bạn có thể truy cập mô hình trên trang web của DeepSeek; họ cung cấp quyền truy cập API trả phí và một công cụ chat. Mã nguồn có trên GitHub và bài báo nghiên cứu được lưu trữ trên arXiv.

Các mô hình được lưu trữ trên Huggingface—tuy nhiên, bạn cần phần cứng cấp nghiên cứu để chạy cục bộ do kích thước lớn.

Điểm chuẩn DeepSeek-Coder-V2

Hãy xem DeepSeek-Coder-V2 thể hiện thế nào trên các bộ điểm chuẩn và so sánh với các mô hình như GPT-4 Turbo, Gemini 1.5 Pro, Claude 3 Opus, LLaMA 3-70B và Codestral.

Nguồn: Qihao Zhu và cộng sự

HumanEval

Bộ điểm chuẩn HumanEval đo lường khả năng sinh mã bằng cách đánh giá liệu mã sinh ra có vượt qua các bài kiểm thử đơn vị cụ thể hay không. DeepSeek-Coder-V2 thể hiện xuất sắc ở bộ này, đạt độ chính xác 90,2%. Kết quả này nhấn mạnh khả năng tạo ra các đoạn mã hoạt động và chính xác, ngay cả trong các tình huống phức tạp.

MBPP+

Bộ điểm chuẩn MBPP+ tập trung vào khả năng hiểu mã, đánh giá khả năng của mô hình trong việc nắm bắt cấu trúc và ngữ nghĩa của mã. DeepSeek-Coder-V2 tiếp tục vượt trội, đạt độ chính xác 76,2%, cho thấy sự hiểu biết vững về ý nghĩa và chức năng của mã.

MATH

Bộ điểm chuẩn MATH kiểm tra khả năng suy luận toán học trong ngữ cảnh mã. DeepSeek-Coder-V2 giữ vững ưu thế với độ chính xác 75,7%, cho thấy năng lực xử lý các phép toán và logic toán học nhúng trong mã—một khía cạnh then chốt của nhiều nhiệm vụ lập trình.

GSM8K

Bộ điểm chuẩn GSM8K tập trung giải các bài toán đố toán tiểu học, đánh giá kỹ năng giải quyết vấn đề rộng hơn ngoài việc thuần sinh mã. DeepSeek-Coder-V2 xếp ngay sau Claude 3 Opus với độ chính xác 94,9%, cho thấy khả năng hiểu và giải bài toán toán học trình bày bằng ngôn ngữ tự nhiên.

Aider

Bộ điểm chuẩn Aider đánh giá khả năng hỗ trợ và gợi ý mã của mô hình. DeepSeek-Coder-V2 dẫn đầu với độ chính xác 73,7%, gợi ý tiềm năng trở thành công cụ giá trị cho lập trình viên cần hướng dẫn và hỗ trợ theo thời gian thực khi mã hóa.

LiveCodeBench

Bộ điểm chuẩn LiveCodeBench đo lường hiệu năng sinh mã trong bối cảnh thực tế. DeepSeek-Coder-V2 đạt độ chính xác 43,4% (xếp thứ hai sau GPT-4-Turbo-0409), cho thấy khả năng tạo ra mã có thể sử dụng trong tình huống thực tiễn.

SWE Bench Benchmark

​​Bộ điểm chuẩn SWE-Bench đánh giá cụ thể khả năng của các mô hình AI trong việc thực hiện nhiệm vụ kỹ thuật phần mềm như sinh mã, gỡ lỗi và hiểu các khái niệm lập trình phức tạp. Ở bối cảnh này, DeepSeek-Coder-V2 đạt 12,7—một kết quả vững nhưng chưa dẫn đầu. Mô hình kém hơn GPT-4-Turbo-0409 (18,7) và Gemini-1.5-Pro (18,3), những mô hình thể hiện năng lực vượt trội ở các tác vụ này. Tuy nhiên, DeepSeek-Coder-V2 vẫn vượt qua các mô hình như Claude-3-Opus (11,7), Llama-3-70B (2,7) và Codestral, cho thấy đây là lựa chọn đáng tin cậy nhưng chưa thuộc nhóm dẫn đầu cho ứng dụng kỹ nghệ phần mềm theo điểm chuẩn này.

Cách DeepSeek-Coder-V2 hoạt động

DeepSeek-Coder-V2 được phát triển dựa trên nền tảng mô hình DeepSeek-V2, sử dụng kiến trúc Mixture-of-Experts (MoE) tinh vi để đạt hiệu năng cao ở các tác vụ liên quan đến mã. Mô hình khai thác nhiều mô hình chuyên gia, mỗi mô hình chuyên cho một nhiệm vụ mã khác nhau, và động chọn chuyên gia phù hợp nhất dựa trên đầu vào. Cách tiếp cận này giúp tăng hiệu quả và độ chính xác.

Quy trình huấn luyện của DeepSeek-Coder-V2 gồm nhiều thành phần then chốt. Mô hình được tiền huấn luyện trên bộ dữ liệu toàn diện gồm 60% mã nguồn, 10% ngữ liệu toán và 30% ngôn ngữ tự nhiên, tổng cộng 10,2 nghìn tỷ token. Bộ dữ liệu đa dạng này cho phép mô hình hiểu và sinh mã hiệu quả. Tập mã nguồn bao gồm 1.170 tỷ token lấy từ GitHub và CommonCrawl, bao phủ 338 ngôn ngữ lập trình—một mở rộng đáng kể so với các mô hình trước.

DeepSeek-Coder-V2 features

Sau giai đoạn tiền huấn luyện, mô hình được tinh chỉnh bằng tập dữ liệu hướng dẫn chuyên biệt bao gồm hướng dẫn về mã, toán học và ngôn ngữ phổ thông. Quy trình này cải thiện khả năng phản hồi trước các lời nhắc ngôn ngữ tự nhiên, biến mô hình thành một trợ lý hữu ích.

Đối với những ai quan tâm đến kiến trúc nền tảng, mô hình DeepSeek-V2—cơ sở cho DeepSeek-Coder-V2—giới thiệu các đổi mới như Multi-head Latent Attention (MLA) và khung DeepSeekMoE. Những đổi mới này góp phần giúp suy luận hiệu quả và huấn luyện kinh tế, được trình bày chi tiết trong bài báo DeepSeek-V2 trên arXiv.

Bắt đầu với DeepSeek-Coder-V2

Có nhiều cách để bắt đầu sử dụng mô hình DeepSeek-Coder-V2. Bạn có thể chạy mô hình cục bộ thông qua thư viện transformers của Hugging Face. Tuy nhiên, lưu ý rằng các mô hình khá lớn và đòi hỏi tài nguyên tính toán đáng kể.

Ngoài ra, DeepSeek cung cấp API trả phí và giao diện chat trực tuyến tương tự ChatGPT. Chat trực tuyến của DeepSeek còn có thể chạy mã HTML và JavaScript ngay trong cửa sổ chat! Tính năng này khá sáng tạo—tôi mới chỉ thấy điều tương tự trong Artifacts của mô hình Claude 3.5 Sonnet. Trong bài viết này, chúng ta sẽ dùng tính năng chat cho các ví dụ.

DeepSeek-Coder-V2: Ví dụ sử dụng

Ở ví dụ đầu tiên, tôi yêu cầu mô hình lập trình trò chơi cuộc đời của Conway bằng HTML và JavaScript. Tôi đưa ra lời nhắc: “Bạn có thể viết trò chơi cuộc đời của Conway bằng HTML không?” Đây là phản hồi:

Certainly! Below is a simple implementation of Conway's Game of Life using HTML, CSS, and JavaScript. This version will display the grid in an HTML table and update it every second.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Conway's Game of Life</title>
    <style>
        table {
            border-collapse: collapse;
        }
        td {
            width: 10px;
            height: 10px;
            border: 1px solid #ccc;
        }
        .alive {
            background-color: black;
        }
        .dead {
            background-color: white;
        }
    </style>
</head>
<body>
    <h1>Conway's Game of Life</h1>
    <table id="grid"></table>
    <script>
        const N = 50; // Grid size
        let grid = createGrid(N);
        let intervalId;
        function createGrid(N) {
            let grid = new Array(N);
            for (let i = 0; i < N; i++) {
                grid[i] = new Array(N);
                for (let j = 0; j < N; j++) {
                    grid[i][j] = Math.random() > 0.7 ? 1 : 0;
                }
            }
            return grid;
        }
        function renderGrid(grid) {
            const table = document.getElementById('grid');
            table.innerHTML = '';
            for (let i = 0; i < N; i++) {
                const row = table.insertRow();
                for (let j = 0; j < N; j++) {
                    const cell = row.insertCell();
                    cell.classList.add(grid[i][j] ? 'alive' : 'dead');
                }
            }
        }
        function updateGrid(grid) {
            const newGrid = grid.map(row => row.slice());
            for (let i = 0; i < N; i++) {
                for (let j = 0; j < N; j++) {
                    const aliveNeighbors = countAliveNeighbors(grid, i, j);
                    if (grid[i][j] === 1) {
                        newGrid[i][j] = aliveNeighbors === 2 || aliveNeighbors === 3 ? 1 : 0;
                    } else {
                        newGrid[i][j] = aliveNeighbors === 3 ? 1 : 0;
                    }
                }
            }
            return newGrid;
        }
        function countAliveNeighbors(grid, x, y) {
            let count = 0;
            for (let i = -1; i <= 1; i++) {
                for (let j = -1; j <= 1; j++) {
                    if (i === 0 && j === 0) continue;
                    const newX = (x + i + N) % N;
                    const newY = (y + j + N) % N;
                    count += grid[newX][newY];
                }
            }
            return count;
        }
        function startGame() {
            intervalId = setInterval(() => {
                grid = updateGrid(grid);
                renderGrid(grid);
            }, 1000);
        }
        renderGrid(grid);
        startGame();
    </script>
</body>
</html>

Chúng ta cũng có thể nhấp nút “Run HTML” ở cuối phản hồi để chạy trò chơi trực tiếp trong cửa sổ chat.

Deepseek chat interface allows running HTML and JavaScript

Ảnh chụp màn hình bởi tác giả.

Tiếp theo, tôi yêu cầu mô hình tạo một website động cho trò chơi, nơi tôi có thể chọn cấu hình bàn cờ khởi đầu. Kết quả trông như thế này và hoạt động khá trơn tru.

Dynamic game of life website.

Ảnh chụp màn hình bởi tác giả.

Ở ví dụ cuối, tôi kiểm tra mô hình với một bài toán khó của Project Euler—bài toán “chú ếch nhảy”. Đây là đoạn mã mô hình sinh ra:

import numpy as np

MOD = 10**9


def matrix_power(matrix, n):
    result = np.identity(len(matrix), dtype=int)

    while n > 0:
        if n % 2 == 1:
            result = np.dot(result, matrix) % MOD

        matrix = np.dot(matrix, matrix) % MOD
        n //= 2

    return result


def fib_matrix(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1

    A = np.array([[1, 1, 1], [1, 0, 0], [0, 1, 0]], dtype=int)
    A_power = matrix_power(A, n - 3)
    initial_vector = np.array([2, 1, 1])

    return np.dot(A_power, initial_vector)[0] % MOD


def S(L):
    result = 0

    for n in range(1, L + 1):
        f_n = fib_matrix(n)
        result = (result + f_n**3) % MOD

    return result


# Compute S(10**14) % 10**9
print(S(10**14))

Đoạn script này sẽ chạy rất lâu, nên tôi yêu cầu mô hình tối ưu và nhận được kết quả sau:

import numpy as np

MOD = 10**9


def matrix_power(matrix, n):
    result = np.identity(len(matrix), dtype=int)

    while n > 0:
        if n % 2 == 1:
            result = np.dot(result, matrix) % MOD
        matrix = np.dot(matrix, matrix) % MOD
        n //= 2

    return result


def fib_matrix(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1

    A = np.array([[1, 1, 1], [1, 0, 0], [0, 1, 0]], dtype=int)
    A_power = matrix_power(A, n - 3)
    initial_vector = np.array([2, 1, 1])

    return np.dot(A_power, initial_vector)[0] % MOD


def find_pisano_period(m):
    previous, current = 0, 1
    for i in range(m * m):
        previous, current = current, (previous + current) % m
        if previous == 0 and current == 1:
            return i + 1


def S(L):
    pisano_period = find_pisano_period(MOD)
    period_sum = 0

    for n in range(1, pisano_period + 1):
        f_n = fib_matrix(n)
        period_sum = (period_sum + f_n**3) % MOD

    full_periods, remainder = divmod(L, pisano_period)
    result = (full_periods * period_sum) % MOD

    for n in range(1, remainder + 1):
        f_n = fib_matrix(n)
        result = (result + f_n**3) % MOD

    return result


# Compute S(10**14) % 10**9
print(S(10**14))

Tôi để phiên bản tối ưu chạy nửa giờ nhưng vẫn chưa ra kết quả. Dù tôi cho rằng hướng giải là đúng, thách thức nằm ở việc tối ưu hiệu năng. Khi chỉ có 328 người giải được bài này, việc mô hình không thể giải cũng không quá bất ngờ.

Kết luận

DeepSeek-Coder-V2 là một bổ sung đáng chú ý cho lĩnh vực trợ lý mã hóa mã nguồn mở đang phát triển, thể hiện hiệu năng cạnh tranh với các mô hình độc quyền lâu nay.

Để tận dụng tối đa DeepSeek-Coder-V2, hãy tuân thủ thực hành tốt: đưa ra lời nhắc rõ ràng, cụ thể. Tôi cũng khuyến khích bạn phản hồi cho nhà phát triển nếu gặp lỗi.

Nếu muốn tìm hiểu thêm về các trợ lý mã hóa bằng AI, tôi khuyên bạn nghe tập podcast DataFramed này: Tương lai của lập trình với Kyle Daigle, COO tại GitHub.

Dimitri Didmanidze

Tác giả

Dimitri Didmanidze

Tôi là Dimitri Didmanidze, một nhà khoa học dữ liệu hiện đang theo học Thạc sĩ Toán học với trọng tâm là Học máy. Hành trình học thuật của tôi còn bao gồm nghiên cứu về khả năng của các mô hình dựa trên transformer và giảng dạy ở bậc đại học, giúp tôi hiểu sâu hơn các khái niệm lý thuyết phức tạp. Tôi cũng từng làm việc trong ngành ngân hàng, nơi tôi áp dụng những nguyên lý này để giải quyết các thách thức dữ liệu trong thực tế.

Chủ đề

Liên quan