DeepSeek: Kod LLM’lerinde Güçlü Verimliliği Ortaya Çıkarma
DeepSeek Kod LLM’leri lidertablosunda belirdi, işte detayları.
For English:
DeepSeek (深度求索), 2023 yılında kurulan, kendini AGI’ı gerçeğe dönüştürmeye adamış bir Çin şirketidir.
DeepSeek’in modellerinin henüz bir makalesi yayınlanmamıştır. DeepSeek’in kod modelleri açık kaynaklı modellerdir (model ağırlıkları yayınlanmıştır). DeepSeek, Code LLM sıralamasında en üst sıralarda yer almaya başlamıştır.
Yalnızca 7 milyar parametreye sahip modelinin bu denli performansa nasıl sahip olduğu merak konusudur.
- Devasa Eğitim Verileri: %87 kod ve %13 Çince ve İngilizce dil verileri dahil olmak üzere 2 trilyon token üzerinde sıfırdan eğitilmiştir.
- Son Derece Esnek ve Ölçeklenebilirdir: 1B, 5.7B, 6.7B ve 33B model boyutlarında sunulduğu için kullanıcıların gereksinimlerine en uygun kurulum seçilebilir.
- Üstün Model Performansı: HumanEval, MultiPL-E, MBPP, DS-1000 ve APPS kıyaslamalarında halka açık kod modelleri arasında en son teknoloji performansı göstermektedir.
- Gelişmiş Kod Tamamlama Yetenekleri: 16K bağlam boyutu ile boşluk doldurma görevi, proje düzeyinde kod tamamlama ve doldurma görevlerini desteklemektedir.
DeepSeek’in desteklediği diller
['julia', 'matlab', 'tcsh', 'mathematica', 'cpp', 'fortran', 'yacc', 'powershell', 'go', 'clojure', 'sas', 'zig', 'verilog', 'isabelle', 'literate-agda', 'c-sharp', 'erlang', 'sparql', 'java-server-pages', 'java', 'stan', 'stata', 'visual-basic', 'augeas', 'applescript', 'emacs-lisp', 'json', 'rmarkdown', 'smalltalk', 'prolog', 'scala', 'ada', 'lean', 'pascal', 'literate-haskell', 'assembly', 'c', 'sql', 'php', 'javascript', 'bluespec', 'dockerfile', 'tex', 'protocol-buffer', 'awk', 'html', 'f-sharp', 'ruby', 'vhdl', 'elm', 'maple', 'idris', 'python', 'thrift', 'common-lisp', 'tcl', 'restructuredtext', 'batchfile', 'rust', 'r', 'typescript', 'markdown', 'antlr', 'agda', 'cmake', 'css', 'scheme', 'literate-coffeescript', 'groovy', 'coffeescript', 'cuda', 'glsl', 'standard-ml', 'yaml', 'lua', 'jupyter-notebook', 'ocaml', 'xslt', 'alloy', 'elixir', 'systemverilog', 'shell', 'perl', 'solidity', 'haskell', 'racket', 'kotlin', 'makefile', 'dart']
Performans
DeepSeek-Coder-Base-33B’nin mevcut açık kaynak kodlu LLM’lerden önemli ölçüde daha iyi performans göstermektedir. CodeLlama-34B ile karşılaştırıldığında HumanEval Python, HumanEval Multilingual, MBPP ve DS-1000'de sırasıyla %7,9, %9,3, %10,8 ve %5,9 oranında öndedir. Şaşırtıcı bir şekilde DeepSeek-Coder-Base-7B ürünümüz CodeLlama-34B performansına ulaşmaktadır. Instruciton finetuning’den sonra DeepSeek-Coder-Instruct-33B modeli, HumanEval’de GPT35-turbo’dan daha iyi performans göstermiştir ve MBPP’de GPT35-turbo ile karşılaştırılabilir sonuçlar elde etmiştir.
Veri Oluşturma ve Model Eğitimi
Veri Oluşturma
DeepSeek için veri aşağıdaki adımlarla oluşturulmuştur.
- Adım 1: GitHub’dan kod verileri toplanmıştır ve verileri filtrelemek için StarCoder Data ile aynı filtreleme kuralları uygulanmıştır.
- Adım 2: Dosya konumlarını bağımlılıklarına göre yeniden düzenlemek için aynı repodaki dosyaların bağımlılıkları ayrıştırılmıştır.
- Adım 3: Tek bir örnek oluşturmak için bağımlı dosyalar birleştirilmiş ve veri tekilleştirme için repo düzeyinde “minhash” kullanılmıştır.
- Adım 4: Syntax hataları veya okunabilirliği düşük olan kodlar gibi düşük kaliteli kodlar daha fazla filtrelenmiştir.
Model Eğitimi
- Adım 1: Başlangıçta model %87'si kod, %10'u kodla ilgili dil (Github Markdown ve StackExchange) ve %3'ü kodla ilgisi olmayan Çince dilinden oluşan bir veri kümesiyle önceden eğitilmiştir. Bu adımda modeller 1,8 trilyon token ve 4K bağlam boyutu kullanılarak önceden eğitilmiştir.
- Adım 2: Ek 200B token üzerinde genişletilmiş 16K bağlam boyutu kullanılarak daha ileri pretraining yapılarak, temel modeller (DeepSeek-Coder-Base) elde edilmiştir.
- Adım 3: 2B token talimat verisi üzerinde instruction finetuning yaparak instruction finetuning modelleri oluşmuştur (DeepSeek-Coder-Instruct).
Maksimum performans elde etmek için DeepSeek’e özgü istem stili:
You are an AI programming assistant, utilizing the DeepSeek Coder model, developed by DeepSeek Company, and you only answer questions related to computer science. For politically sensitive questions, security and privacy issues, and other non-computer science questions, you will refuse to answer.
### Instruction:
['content']
### Response:
['content']
<|EOT|>
### Instruction:
['content']
### Response:
Genel İstemleme Stili
Açık kaynaklı modeller için genel yönlendirme stilini hatırlayalım.
Doğal dildeki metin çıkarım için ideal değildir çünkü model bir <EOS> tokeni üretene kadar doğal olarak istenmeyen cevaplar üretecektir ve bunu önlemek için genellikle bazı son işlemler veya ek işlemler gerekir.
Daha iyi bir yaklaşım, her cevabı yanıtın rolünü belirten bir dizi özel tokenle saran ChatML gibi yapılandırılmış bir format kullanmaktır.
Bu formatta aşağıdaki özel tokenlara sahibiz:
- <|system|>: Diyaloğun hangi bölümünün asistanın karakterini koşullandıracak sistem mesajını içerdiğini belirtir.
- <|user|>: Mesajın insan kullanıcıdan geldiğini belirtir.
- <|assistant|>: Mesajların yapay zeka asistanından geldiğini belirtir.
- <|end|>: Bir dönüşün veya sistem mesajının sonunu gösterir.
Nasıl göründüğünü görmek için çalışan örneğimizi bu tokenlerle saran bir metod yazabilirsiniz:
system_token = "<|system|>"
user_token = "<|user|>"
assistant_token = "<|assistant|>"
end_token = "<|end|>"
def prepare_dialogue(example):
system_msg = "Below is a dialogue between a human and an AI assistant called StarChat."
prompt = system_token + "\n" + system_msg + end_token + "\n"
for message in example["messages"]:
if message["role"] == "user":
prompt += user_token + "\n" + message["content"] + end_token + "\n"
else:
prompt += assistant_token + "\n" + message["content"] + end_token + "\n"
return prompt
print(prepare_dialogue(sample))
'''
<|system|>
Below is a dialogue between a human and AI assistant called StarChat.
<|end|>
<|user|>
Is it possible to imagine a society without law?<|end|>
<|assistant|>
It is difficult to imagine ...<|end|>
<|user|>
It seems like you ...<|end|>
<|assistant|>
You are correct ...<|end|>
<|user|>
Yeah, but laws are complicated ...<|end|>
'''
Bir sonraki adım, bu özel tokenleri tokenizer’ın sözlüğüne dahil etmektir, o halde StarCoder tokenizer’ı indirip ekleyelim:
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bigcode/starcoderbase")
tokenizer.add_special_tokens({"additional_special_tokens": ["<|system|>", "<|assistant|>", "<|user|>", "<|end|>"]})
# Check the tokens have been added
print(tokenizer.special_tokens_map)
'''
{
"bos_token": "<|endoftext|>",
"eos_token": "<|endoftext|>",
"unk_token": "<|endoftext|>",
"additional_special_tokens": ["<|system|>", "<|assistant|>", "<|user|>", "<|end|>"],
}
'''
Kaynaklar
[1] BigCode, (December 2023), Big Code Models Leaderboard:
[https://huggingface.co/spaces/bigcode/bigcode-models-leaderboard]
[2] deepseek-ai, (December 2023), DeepSeek-Coder:
[https://github.com/deepseek-ai/DeepSeek-Coder]
[3] DeepSeek,(2023), DeepSeek Coder:Let the Code Write Itself
[https://deepseekcoder.github.io/]
[4]lewtun et al. ,(May 9, 2023), Creating a Coding Assistant with StarCoder: