StarCoder 2:GitHub Copilot本地开源LLM替代方案

news2024/12/23 23:50:29

GitHub CoPilot拥有超过130万付费用户,部署在5万多个组织中,是世界上部署最广泛的人工智能开发工具。使用LLM进行编程辅助工作不仅提高了生产力,而且正在永久性地改变数字原住民开发软件的方式,我也是它的付费用户之一。

低代码/无代码平台将使应用程序创建、工作流自动化和数据分析更加广泛的应用,这种变革潜力支撑着人们对开源替代方案的极大兴趣,我们今天将要介绍的这个令人兴奋的发展。最近BigCode与NVIDIA合作推出了StarCoder2,这是一系列专为编码而设计的开放式LLM,我认为在大小和性能方面是目前最好的开源LLM。

在本文中,我们将介绍StarCoder2的一些基本信息,然后建立一个本地环境,搭建StarCoder2-15B模型并用Python, JavaScript, SQL, c++和Java测试其编码能力。

StarCoder2简介

StarCoder2模型有三种不同大小可供选择,包括3B、7B和15B参数,并且支持广泛的编程语言。每个模型都是在The Stack v2上进行训练的,这是当前最广泛的用于LLM预训练的开源代码数据集。模型的主要特点如下:

  • 3B(由ServiceNow提供)、7B(由Hugging Face提供)和15B参数版本(由NVIDIA使用NVIDIA NeMo)
  • 所有模型使用分组查询注意力(Grouped Query Attention)
  • 上下文窗口为16,384个标记,滑动窗口注意力为4,096个标记
  • 模型是使用填空目标(Fill-in-the-Middle objective)进行训练的
  • 训练时使用了3+ T(3B)、3.5+ T(7B)、4+ T(15B)标记以及600多种编程语言
  • StarCoder2–15B在StarCoder2模型中是最佳的,并在许多评估中与其他33B+模型相匹配。StarCoder2–3B的性能与StarCoder1–15B相当
  • 训练时使用了1024 x H100 NVIDIA GPU
  • 所有模型均具有商业友好的许可证

StarCoder2的能力(特别是15B模型)在性能指标中明显优于其他相同尺寸的模型,并且与CodeLlama-34B相匹配。

在具有16K标记的上下文长度下,模型处理广泛的代码库和指令,确保了全面的代码理解和生成能力。

StarCoder2安装

为了简单起见,我们使用venv创建虚拟环境,然后安装相应的包

 # Create a virtual environment
 mkdirstarcoder2&&cdstarcoder2
 python3-mvenvstarcoder2-env
 sourcestarcoder2-env/bin/activate
 
 # Install dependencies
 pip3installtorch
 pip3installgit+https://github.com/huggingface/transformers.git
 pip3installdatasets
 pip3installipykerneljupyter
 pip3install--upgradehuggingface_hub
 pip3installaccelerate# to run the model on a single / multi GPU
 pip3installbitsandbytes
 
 # Loging to Huggingface Hub
 huggingface-clilogin
 
 # Optionally, fire up VSCode or your favorite IDE and let's get rolling!
 code .

看看15B模型的内存占用:

  • torch.bfloat16,~32.2 GB
  • load_in_8bit, ~16.9 GB
  • load_in_4bit, ~9.2 GB

可以看到,如果使用24G的GPU,那么最高的量化模型是8bit,所以这里我们呢直接使用它

 fromtransformersimportAutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
 
 #如果你的内存太小需要使用 4bit 那么用这个参数 `load_in_4bit=True` 
 quantization_config=BitsAndBytesConfig(load_in_8bit=True)
 
 checkpoint="bigcode/starcoder2-15b"
 tokenizer=AutoTokenizer.from_pretrained(checkpoint)
 model=AutoModelForCausalLM.from_pretrained(checkpoint, quantization_config=quantization_config)

这样模型就会自动下载和加载

让我们检查模型的内存占用:

 print(f"Memory footprint: {model.get_memory_footprint() /1e6:.2f} MB")
 # Memory footprint: 16900.18 MB

这样模型就算加载成功了,下面我们使用5道不同语言的编码题,如Python, JavaScript, SQL, c++和Java,来评估其编码能力。

编码能力测试

我们直接调用generate函数就可以获得模型的输出,这里也可以更改max_length来获得更多的上下文

 inputs=tokenizer.encode("def factorial(n):", return_tensors="pt").to("cuda")
 outputs=model.generate(inputs, eos_token_id=tokenizer.eos_token_id, max_length=100, num_return_sequences=1)
 print(tokenizer.decode(outputs[0]))

下面的prompt就是我们让它为我们的函数进行补全,我们输入的是

 def factorial(n):

让模型帮我们继续生成这个函数,结果如下:

 def factorial(n):
     if n == 0:
         return 1
     else:
         return n * factorial(n-1)
 
 print(factorial(5))

Python中使用递归计算数字的阶乘是正确的。当调用factorial(5)时,它会正确地计算出5。如果n == 0,返回1,确保递归正确结束。因为我们没有输入任何要求,所以它返回这个结果没有任何问题,并且这个函数是可以正确运行的,看样子还不错。

下面我们来进行一个JS的问题,后面我们就不编写代码了,直接输入我们的prompt

 function filterArray(arr) {
     // Complete the function to filter out numbers greater than 10

结果如下:

  function filterArray(arr) {
      // Complete the function to filter out numbers greater than 10
   return arr.filter(function(num){
    return num <= 10;
   });
  }

filterArray函数使用array .prototype.filter方法,该方法创建一个包含所有通过所提供函数实现的测试的元素的新数组。测试是num <= 10,因此新数组将只包含小于或等于10的数字,有效地过滤掉所有大于10的数字。这也是按照我们的函数注释要求来编写的。

下一个是SQL语句

 # generate a SQL query that selects all columns from a table named 'employees' where the 'salary' is greater than 50000.
 SELECT * FROM employees WHERE

结果如下:

  SELECT * FROM employees WHERE
 salary > 50000;

c++

 #include <iostream>
 class Rectangle {
 private:
     int width, height;
 public:
     Rectangle(int w, int h) : width(w), height(h) {}
     // Complete the class with methods to calculate area and perimeter
     int getArea();
     int getPerimeter();
 };

结果如下:

  #include <iostream>
  class Rectangle {
  private:
      int width, height;
  public:
      Rectangle(int w, int h) : width(w), height(h) {}
      // Complete the class with methods to calculate area and perimeter
      int getArea();
      int getPerimeter();
  };
 
  int Rectangle::getArea() {
      return width * height;
  }
 
  int Rectangle::getPerimeter() {
      return 2 * (width + height);
  }
 
  int main() {
      int w, h;
      std::cin >> w >> h;
      Rectangle r(w, h);
      std::cout << r.getArea() << std::endl;
      std::cout << r.getPerimeter() << std::endl;
      return 0;
  }

Rectangle类的实现是正确的。它正确地定义了成员函数getArea和getPerimeter,分别计算并返回矩形的面积和周长。main函数从标准输入中读取矩形的宽度和高度,然后创建一个rectangle对象r并输出其面积和周长。

运行这个程序时,它将等待用户输入两个整数(表示宽度和高度),然后它将根据这些值显示计算出的面积和周长。

Java

 public class Main {
     public static boolean isPrime(int number) {
         // Complete the method to check if number is prime
     }
 }

结果如下:

  public class Main {
      public static boolean isPrime(int number) {
          if (number <= 1) {
              return false;
          }
          for (int i = 2; i < number; i++) {
              if (number % i == 0) {
                  return false;
              }
          }
          return true;
      }
  }

代码在语法和逻辑上都是正确的,它涵盖了排除小于或等于1的数字的基本情况,并迭代检查给定数字的任何除数。如果找到除数,则返回false;如果没有找到除数,则返回true,正确识别该数为素数。

总结

上面的几个简单的例子可以证明StarCoder2作为Copilot的本地替代应该是没有问题的,我们日常工作中也只是让LLM帮我们完成一些简单的代码,并不会让他进行具体的系统设计工作,所以StarCoder2在这方面应该是没问题的。

但是我们也可以看到在所有这些例子中,代码都是有优化的空间的,如果你需要极致的效率恐怕StarCoder2做不到,估计Copilot也做不到。

目前看StarCoder2是拥有巨大的潜力,特别是考虑到它的大小和性能指标。虽然完全取代GitHub Copilot估计还做不到。因为它还有一些小毛病,比如在提供解决方案后,它会不时输出额外的乱码(这可能和精度有关,据说使用版精度或全精度会好,但我不确定)。

另外就是它需要在本地占用大约16G的显存,如果没有显卡使用cpu推理的话那就需要额外的16G内存,并且速度还很慢(但是国内Copilot也不快)。

如果你没有Copilot它还是值得一试的,因为毕竟对于我们来说多了一个选择和获取解决方案的渠道。这里我们也可以看到在2024年这类高性能的开源编码LLM还会继续发展,我们会深入的关注它的发展。

论文地址:

https://avoid.overfit.cn/post/c6c8a0130c934a4da024ebdb8108ae8d

作者:Datadrifters

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1499982.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SSM框架的艺术交流平台设计与实现

目 录 摘 要 I Abstract II 引 言 1 1相关技术 3 1.1 jQuery技术简介 3 1.2 SSM框架简介 3 1.3 Bootstrap框架简介 3 1.4 ECharts框架简介 4 1.5 MVC设计模式简介 4 1.6 Ajax技术简介 4 1.7 MySQL数据库简介 4 1.8本章小结 4 2.1功能需求 5 2.2非功能需求 9 2.3本章小结 10 3系…

C++程序设计-第四/五章 函数和类和对象【期末复习|考研复习】

前言 总结整理不易&#xff0c;希望大家点赞收藏。 给大家整理了一下C程序设计中的重点概念&#xff0c;以供大家期末复习和考研复习的时候使用。 文章目录 前言第四章 函数 函数和类和对象4.1 说明带参数的宏与内联函数有什么不同4.2 全局变量和局部变量有什么区别是怎么实现的…

理解BS期权定价

开局放图 1.完整图示 开局一张图&#xff01;全篇编的尽可能通俗化&#xff0c;有些地方避免不了用公式解释&#xff0c;内容的完整流程图示绘制如下&#xff0c;建议全篇读完后再看流程图。 2.背景知识 期权介绍 首先简单介绍下期权背景知识&#xff0c;期权&#xff08;O…

Gitlab: PHP项目CI/CD实践

目录 1 说明 2 CI/CD 2.1 部署方式一&#xff1a;增量部署 2.1.1 目标服务器准备 2.2.2 Gitlab及Envoy脚本 2.2 部署方式二&#xff1a;镜像构建与部署 2.2.1 推送到私有化容器仓库 准备工作 脚本 要点 2.2.2 推送到hub.docker.com 准备工作 脚本 3 参考&#x…

Take-home questions——L3

Match the spatial domain image to the Fourier magnitude image 1—D 2—B 3—A 4—E 5—C

一分钟安装使用教程,无需服务器,一台电脑就可使用!全网最快速便捷使用Claude 3方法!

随着AI的应用变广&#xff0c;各类AI程序已逐渐普及&#xff0c;尤其是在一些日常办公、学习等与撰写/翻译文稿密切相关的场景&#xff0c;大家都希望找到一个适合自己的稳定可靠的ChatGPT软件来使用。 ChatGPT-Next-Web就是一个很好的选择。它是一个Github上超人气的免费开源…

如果用户被诱导添加了证书甚至根证书,那哪怕用了 HTTPS,使用中间人攻击就可以窃取用户所有信息了?

最近突然想到一个问题&#xff0c;HTTPS 真的足够安全吗&#xff1f;在一些对安全性要求比较高的项目里&#xff0c;能只依赖 HTTPS 来保证数据安全吗&#xff1f; 我们也用过fiddler 、whistle 等代理软件&#xff0c;也知道要能劫持流量后能看到请求和返回的内容需要添加证书…

ChatGPT 升级出现「我们未能验证您的支付方式/we are unable to authenticate」怎么办?

ChatGPT 升级出现「我们未能验证您的支付方式/we are unable to authenticate」怎么办&#xff1f; 在订阅 ChatGPT Plus 时&#xff0c;有时候会出现以下报错 &#xff1a; We are unable to authenticate your payment method. 我们未能验证您的支付方式。 出现 unable to a…

Apollo决策规划 - EM planner

旨在对b站老王所讲的百度Apollo - EM planner算法做浓缩版总结 0 决策规划背景 基于图搜索 优点&#xff1a; 可以得到全局层面最优解&#xff0c;适用于比较低维数的规划问题 缺点&#xff1a; 规划问题维数较高时&#xff0c;面临指数爆炸问题 基于采样 优点&#xff1a;…

各大厂商常用的弱口令集合

Oms呼叫中心 KXTsoft2010 Glodon控制台 admin TRENDnet趋势网络摄像头 admin/admin MOBOTIX-视频监控 admin/meinsm 思科Cisco 没有原始密码, 第一次登录时需要创建 DRS admin/1234 Honeywell admin/1234 安迅士Axis root/pass, 新安迅士摄像头在用户第一登录时要求创建…

Winform窗体随着屏幕的DPI缩放,会引起窗体变形及字体变形,superTabControl标签字体大小不匹配

一、前言 superTabControl做的浏览器标签(cefsharp)在缩放比例(125%,150%时字体不协调) 物联网浏览器,定制浏览器,多媒体浏览器(支持H264)参考栏目文章即可 二、配置参数 app.manifest参数 dpiAware =true <application xmlns="urn:schemas-microsoft-c…

保持自律,改变形象,认真对待自己

不知道一年365天里究竟有多少个节日&#xff0c;昨天网络上刚过了“女生节”&#xff0c;今天又来了“三八妇女节”。笔者从来都是女权支持者&#xff0c;但也主张切勿支持过了头而形成“女尊男卑”&#xff0c;认为应当遵循“顺其自然”这一规律为好。 有鉴于此&#xff0c;本…

LORA: LOW-RANK ADAPTATION OF LARGE LAN-GUAGE MODELS

TOC 1 前言2 方法2.1 LOW-RANK-PARAMETRIZED UPDATE MATRICES 1 前言 1) 提出背景 大模型时代&#xff0c;通常参数都是上亿级别的&#xff0c;若对于每个具体任务都要去对大模型进行全局微调&#xff0c;那么算力和资源的浪费是巨大的。 根据流形学习思想&#xff0c;对于数…

基于SSM的房客源信息管理系统设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 SSM框架 3 1.2 Vue框架 3 1.3 ECharts 3 1.4 JQuery技术 3 1.5 本章小结 4 2系统分析 5 2.1 需求分析 5 2.2 非功能需求 8 2.3 本章小节 8 3 系统设计 9 3.1 系统总体设计 9 3.1.1 系统体系结构 9 3.1.2 系统目录结构 9 3…

高效办公-浏览器基本操作

日常我们使用电脑&#xff0c;其实很大部分是用于网络功能&#xff0c;这里面除了客户端程序剩余的就是通过我们的浏览器获取信息或者使用业务系统了&#xff0c;这里就简单学习下浏览器基本常识与操作。 一、浏览器是什么&#xff1f; 白话讲浏览器就是一个软件&#xff0c;我…

Docker安装Redis (全网最详细教程!!!)

一、Redis简介 二、简易版本启动&#xff08;学习版&#xff09; 1、一条命令直接搞定 2、docker ps 命令&#xff0c;查看本机docker运行的容器 3、docker logs 查看日志 4、测试连接 5、优缺点 三、生产版本启动 四、Docker 停止、删除、重启、启动容器 一、Redis简介…

mysql的语法学习总结3(一些常见的问题)

执行后&#xff0c;MySQL 会重新加载授权表并更新权限。 FLUSH PRIVILEGES; 怎么检查自己的电脑端口3306有没有被占用&#xff1f; ESTABLISHED表示被占用&#xff0c;LISTENING表示端口正在被监听&#xff0c;22696是占用该端口的进程的PID&#xff08;进程标识符&#xff0…

手持气象站的优势

【TH-SQ5】手持气象站作为一种便携式的气象监测设备&#xff0c;具有许多显著的优势&#xff0c;主要体现在以下几个方面&#xff1a; 便携性&#xff1a;手持气象站设计精巧&#xff0c;重量轻&#xff0c;易于携带&#xff0c;这使得用户能够轻松地在不同地点进行气象观测&a…

常见数据类型

目录 数据类型 字符串 char nchar varchar varchar2 nvarchar 数字 number integer binary_float binary_double float 日期 date timestamp 大文本数据 大对象数据 Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 数…

通俗深入的理解Sora的架构原理

作者公众号 大数据与AI杂谈 &#xff08;TalkCheap&#xff09;&#xff0c;转载请标明出处 开始之前&#xff0c;先解释一下为什么深入和通俗这两个看似自相矛盾的词可以并列在这里。因为后续的一些文章可能也是类似的思路&#xff0c;所以先简单做一下文章定位的说明。要看正…