diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..d645695673349e3947e8e5ae42332d0ac3164cd7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000000000000000000000000000000000000..b99491d7470f595d1938ba74460b5bb6f314ba0d --- /dev/null +++ b/NOTICE @@ -0,0 +1,30 @@ +Erk-32B +Copyright (c) 2026 eCloud Yazılım Teknolojileri (eCloud Tech.) + +This model is a derivative work of Qwen3-32B +(https://huggingface.co/Qwen/Qwen3-32B), Copyright (c) Alibaba Cloud, +licensed under the Apache License, Version 2.0. The base model's architecture, +tokenizer and chat format are unchanged; eCloud Tech. modified the weights by +continued pretraining on Turkish text (1.05B tokens, LoRA r=256), Turkish +instruction tuning (423M tokens) and an additional instruction round, then +merged the adapter at scale 0.75 and added a default identity system prompt to +the chat template. Details: OLCUM-PROTOKOLU.md. + +Erk-32B is distributed under the Apache License, Version 2.0 (see LICENSE). + +"Erk" and "eCloud Tech." are names and marks of eCloud Yazılım Teknolojileri. +This license does not grant permission to use them to endorse or promote +derived products without prior written permission, except as required for +reasonable and customary attribution. + +-------------------------------------------------------------------------- +Erk-32B +Telif (c) 2026 eCloud Yazılım Teknolojileri (eCloud Tech.) + +Bu model, Apache Lisansı 2.0 ile dağıtılan Qwen3-32B'nin (Alibaba Cloud) +türev çalışmasıdır. Mimari, tokenizer ve sohbet biçimi tabandan gelir; +eCloud Tech. ağırlıkları Türkçe devam-eğitimi, talimat ayarı ve ek turla +değiştirmiş, adaptörü 0,75 ölçeğiyle birleştirmiş ve sohbet şablonuna +varsayılan kimlik istemi eklemiştir. Erk-32B, Apache Lisansı 2.0 ile dağıtılır. +"Erk" ve "eCloud Tech." adları eCloud Yazılım Teknolojileri'ne aittir; bu +lisans marka kullanım hakkı vermez. diff --git a/OLCUM-PROTOKOLU.md b/OLCUM-PROTOKOLU.md new file mode 100644 index 0000000000000000000000000000000000000000..8f7a59c567fca43614ac757c8a24898f5c0c7dfa --- /dev/null +++ b/OLCUM-PROTOKOLU.md @@ -0,0 +1,395 @@ +# Erk-32B — Teknik Rapor ve Ölçüm Protokolü + +**Durum:** 8 Eylül 2026 · devam-eğitimi, talimat ayarı ve ek talimat turu +tamamlandı. Morfoloji kıyasının ilk sürümünde altın cevap hataları bulundu; +tüm morfoloji sayıları düzeltilmiş v2 ile yeniden ölçüldü (4.2). Çalışma +noktası **0,75 + kimlik sistem istemi** (4.2'de gerekçe; 0,40 kararı istemli +karşılaştırma ölçülünce geri alındı). Henüz yayımlanmadı. + +Bu belge, Erk-32B için üretilen her sayının nasıl ölçüldüğünü ve hangi +elemelerden geçtiğini kayda geçirir. Amaç, sonuçların bağımsız olarak +yeniden üretilebilmesi ve eleştiriye ölçümle cevap verilebilmesidir. + +--- + +## 1. Model ve eğitim + +| | | +|---|---| +| Taban | Qwen3-32B (bize ait değildir, her yerde belirtilir) | +| Devam-eğitimi | 1,05B Türkçe token · LoRA r=256 α=512 · 32.000 adım | +| Talimat ayarı | 423M token · 12.909 adım · 2 tur | +| Ek talimat turu | 46.000 örnek (kimlik 6.000 + morfolojik hata düzeltme 40.000) · 1.673 adım · temiz külliyata karıştırılarak | +| Yayın ağırlığı | LoRA 0,75 ile birleştirilmiş, 14 parça safetensors, 62 GB (`erk32b-birlesik-075`); GGUF Q8_0 ve Q4_K_M | +| Donanım | 4×A100-80GB · FSDP · bf16 | +| Toplam hesap | ≈37.000 çekirdek-saat | + +**Çalışma noktası:** LoRA katkısı **0,75** ölçeğiyle uygulanır +(`W = W_taban + 0,75 × LoRA`) ve kimlik sohbet şablonundaki **varsayılan +sistem istemiyle** verilir. Gerekçesi 4.2'de. + +--- + +## 2. Külliyat dökümü + +**Devam-eğitimi (1,32B token, 4,30 GB)** + +| | | +|---|---| +| Kaynak | Türkçe web külliyatı, akış sırasıyla ilk 4 GB | +| Belge | 1.354.261 | +| Dil doğrulaması | %96,83 Türkçe · %0,49 İngilizce · %2,67 belirsiz | +| Yaklaşık tekrar | %1,37 | +| Belge uzunluğu | medyan 1.603 B · %90: 5.739 · %99: 24.541 | + +**Talimat ayarı (373.387 örnek)** + +Ham külliyatta 453.975 örnek vardı. Denetimde, gerçek kod içeren 38.637 +cevabın **%53,5'inin makine çevirisiyle bozulduğu** ölçüldü: sözdizimi +kelime kelime Türkçeleştirilmiş (`using namespace std;` → "ad alanı +std'sini kullanma;"), kod bloğu dil etiketleri çevrilmiş. + +Temizlik: 7.703 bozuk sözdizimi + 12.983 çitsiz kod + 42.330 kopya + +2.910 kimlik beyanı + 14.567 çok kısa cevap elendi. Etiketi çevrilmiş +blokların içindeki kod %100 sağlam olduğu için silinmedi, **onarıldı** +(4.888 örnek kurtarıldı). + +Talimat külliyatında kıyas kirliliği: **n=13 katı eşikte 0/900.** + +--- + +## 3. Ölçüm protokolü + +Ham ölçümlerin büyük kısmı ölçüm yapaylığı çıktı. Aşağıdaki elemeler +uygulanmadan hiçbir sayı raporlanmaz. + +### 3.1 Seçim sızıntısı +Eğitim sırasında izlenen 150 soru rapordan hariç → held-out 750. + +### 3.2 Kirlilik +Kıyas sorularının metni eğitim külliyatında 13-kelimelik pencerelerle aranır. + +| Eşik | Kirli | Held-out 750 içinde | +|---|---|---| +| n=13 (katı) | 113/900 (%12,6) | 98 | +| n=8 (gevşek) | 252/900 (%28,0) | 211 | + +Beklenen bir sonuçtur: web külliyatı ile sınav soruları aynı kaynaklarda +bulunur. Karşılaştırılan taban modelin de benzer veriyi görmüş olması +muhtemeldir; bu yüzden kirli sorular **her iki model için de** atılır. +Raporlanan küme: **temiz 652**. + +Atılmazsa fark ~2 puan şişer (+6,27 → +4,14). + +Not: denetim sorunun **metninin** külliyatta geçtiğini gösterir, cevap +anahtarının sızdığını değil. %12,6 bir üst sınırdır. + +### 3.3 Harf/konum önyargısı +Şıklar dairesel döndürülür, doğru cevap yeni harfine taşınır. Etkisi +ölçüldü: kirli sorularda orijinal sırayla 16,33 puanlık fark, +döndürüldüğünde 6,12'ye düşüp anlamlılığını yitirdi. + +### 3.4 Biçim uyumu +Üretimli ölçüm, talimat-ayarsız modellerde bilgi değil biçim uyumu ölçer. +Morfoloji kıyasında üretimli fark **+36,17**'ydi; ham çıktılarda taban +modelin ya sustuğu ya İngilizce akıl yürütmeye kaydığı görüldü. +Zorunlu-seçim (öğretmen-zorlamalı log-olabilirlik) ile aynı fark **+3,73**. + +### 3.5 Üretim uzunluğu +Sohbet biçiminde taban model önce düşünme bloğu üretir, cevap sonra gelir. +Kısa token sınırı bu modelleri blok ortasında kesip "cevap veremedi" +gösteriyordu (24 token ile taban %0). Blok için yer bırakılır, cevap +bloğun ardından aranır, kesilen örnek sayısı ayrıca raporlanır. + +### 3.6 İstatistik +Her fark için eşleştirilmiş bootstrap (10.000 yeniden örnekleme) ile %95 +güven aralığı verilir. Aralık sıfırı içeriyorsa "fark yok" değil, **"bu +örneklemle gösteremiyoruz"** denir. + +--- + +## 4. Çalışma noktasının seçimi + +Devam-eğitimi sonrası ölçümde bir kusur bulundu: model sohbet biçiminde +cevap veremiyordu. 329 örneğin **tamamında** üretimi durdurmadan web +metni üretmeye devam etti (örnek: çoğul sorusuna haber metniyle karşılık). +Talimat ayarı bunu onardı ama taban modelin seviyesine çıkaramadı +(%54,71 vs %60,49). + +LoRA toplanabilir olduğu için, yeniden eğitim yapmadan ölçek taraması +yapıldı. Sekiz nokta, iki eksende, soru-bazlı vektörlerle: + +| Ölçek | Sohbet (n=329) | Kıyas (n=652) | Kıyas farkı vs taban | +|---|---|---|---| +| 0,00 (taban) | %60,49 | %67,64 | — | +| 0,15 | %62,61 | %70,71 | +3,07 [+0,92, +5,37] | +| 0,20 | %64,13 | %70,86 | +3,22 [+0,77, +5,67] | +| 0,25 | %62,92 | %71,32 | +3,68 [+1,38, +6,13] | +| 0,30 | %62,61 | %72,55 | +4,91 [+2,30, +7,52] | +| 0,35 | %57,45 | %72,85 | +5,21 [+2,61, +7,82] | +| **0,40** | **%63,22** | **%73,16** | **+5,52 [+2,76, +8,28]** | +| 0,50 | %58,05 | %72,55 | +4,91 [+2,30, +7,67] | +| 1,00 (tam güç) | %54,71 | %71,01 | — | + +**Sohbet ekseninde hiçbir ölçek tabandan istatistiksel olarak farklı +değildir** (sekiz güven aralığının hepsi sıfırı içerir). Kıyas ekseninde +hepsi anlamlı derecede iyidir. + +İlk seçim (30 Ağustos): **0,40** — kıyas farkının en yüksek olduğu nokta, +sohbet kaybı yok. Tam güce (1,00) göre kıyas farkı +2,15 [−0,15, +4,45]; +anlamlı değildir. + +### 4.1 Ek talimat turu sonrası tarama (7 Eylül) — v1 kıyasıyla, tarihçe + +*Bu bölümdeki "sohbet" sütunu TurkMorfBench **v1** üretim ölçümüdür. v1'in +altın cevaplarında 18 hata bulunmuş (4.2), sayılar v2 ile yeniden ölçülmüştür. +Bölüm, seçimin nasıl değiştiğini göstermek için korunur; karar 4.2'dedir.* + +Ek tur (kimlik + hata düzeltme) sonrası aynı iki eksen, on iki ölçek: + +| Ölçek | Sohbet (n=329) | Kıyas (n=652) | Kesik | Kimlik (30 soru) | +|---|---|---|---|---| +| 0,00 (taban) | %60,49 | %67,64 | 329 | — | +| 0,40 | %60,18 | **%73,47** | 176 | — | +| 0,70 | %59,57 | %71,47 | 128 | 6/30 | +| 0,75 | %66,87 | %71,47 | 16 | 8/30 | +| **0,80** | **%69,00** | %71,01 | 0 | 12/30 | +| 0,85 | %63,22 | %71,63 | 0 | 15/30 | +| 0,90 | %62,01 | %71,63 | 0 | 19/30 | +| 0,95 | %62,92 | %71,63 | 0 | 22/30 | +| 1,00 | %61,70 | %71,47 | 0 | 28/30 | + +Eşli bootstrap (10.000, tabana karşı): sohbet 0,75 +6,38 [+0,61, +11,85] ve +0,80 +8,51 [+2,43, +14,29]; 0,85'te fark kaybolur (+2,74 [−3,95, +9,42]) ve +0,80 vs 0,85 anlamlıdır (+5,78 [+2,43, +9,12]). **Sohbet ekseninde tabandan +anlamlı derecede iyi bir bölge ilk kez ortaya çıkmıştır: 0,75–0,80 platosu.** +Kıyas 0,70–1,00 arasında düzdür; 0,40 bu bölgeden +2,45 [+0,46, +4,45] +öndedir. + +Ek tur 0,40'ta hiçbir şeyi değiştirmemiştir (sohbet −3,04 [−6,69, +0,91], +kıyas +0,31 [−0,46, +1,07]); tam ölçekteki sohbet düşüşünü onarmıştır +(1,00'da %54,71 → %61,70). + +**Kimlik.** Ağırlıklara işlenen kimlik keskin eşikle değil rampayla gelir ve +ancak 1,00'da oturur (28/30; kalan iki hata: "Erya", "540 milyar +parametre"). Sistem istemiyle 0,40, 0,80 ve 1,00'da **30/30**, tuzak +sorular dahil. İstemin sohbet bedeli 0,80'de −1,52 [−5,47, +2,13], +anlamsız; kıyas istemi ham metin olduğu için etkilenmez. + +**Hata düzeltme öğrenilmemiştir.** Serbest metinde morfolojik hata bulma, +eğitimde kullanılmayan gövdelerle 8 cümlede her ölçekte 4/8 — taban ile +aynı. 40.000 örnek ölçülebilir etki bırakmamıştır; görev ezber değil +genelleme istemektedir. + +7 Eylül'deki seçim 0,80 idi: v1 üretim ekseninde 0,80'in 0,40'a +8,81 +[+3,34, +14,29] üstünlüğü görünüyordu. Bu fark v1'in altın cevap hatalarının +ürünü çıktı (4.2); seçim geri alındı. + +### 4.2 Düzeltilmiş kıyasla yeniden ölçüm ve nihai seçim (8 Eylül) + +**Ne bulundu.** TurkMorfBench v1'de (329 madde) gerçek gövdelerde 18 yanlış +altın cevap vardı: yönelme ekinde yumuşama hiç uygulanmamış (*çocuka, kitapa, +ağaça*), iyelikte her p/ç/t/k gövdesi yumuşatılmış (*südü, buludu, renği*); +uydurma gövdelerde tek bir kural yoktu. Ayrıca zorunlu seçimin az-örnekli +istemi kıyas gövdelerini (*kalem, defter, bardak*) kullanıyordu. Düzeltilmiş +v2 (512 madde, 8 görev, 40 gerçek + 24 uydurma gövde) bağımsız kural +tablosuyla 512/512 doğrulandı, az-örnek gövdeleri kıyas dışından seçildi +(*tahta, sepet, sandalye, kabak*) ve morfolojiye dayanan her sayı yeniden +ölçüldü. + +**Üretim (talimat izleme), v2, n=512:** + +| Ölçek | Üretim | Fark vs taban | Kıyas (652) | +|---|---|---|---| +| 0,00 (taban) | %31,64 | — | %67,64 | +| **0,40** | %55,86 | +24,22 [+18,95, +29,49] | **%73,47** | +| 0,75 | **%61,52** | +29,88 [+24,61, +35,16] | %71,47 | +| 0,80 | %57,42 | +25,78 [+20,51, +31,05] | %71,01 | +| 0,85 | %56,25 | | %71,63 | +| 1,00 | %46,09 | | %71,47 | +| 0,40 + sistem istemi | %49,02 | +17,38 [+11,91, +22,85] | %73,47 | +| 0,75 + sistem istemi | %59,38 | +27,73 [+22,46, +33,01] | %71,47 | +| 0,80 + sistem istemi | %56,05 | | %71,01 | + +İstemsiz noktalar arası: 0,80 vs 0,40 +1,56 [−3,32, +6,45] gösterilemedi +(v1'de +8,81 idi); 0,75 vs 0,40 +5,66 [+0,98, +10,35] anlamlı. + +**Sistem isteminin bedeli ölçeğe bağlı:** 0,40'ta −6,84 [−11,53, −1,95] +(anlamlı), 0,75'te −2,15 [−6,05, +1,56] (gösterilemedi). Dağıtım +yapılandırması istemli olduğu için karşılaştırma istemli noktalar arasında +yapılmalıdır: **0,75 + istem vs 0,40 + istem +10,35 [+5,47, +15,43] anlamlı; +0,80 + istem vs 0,40 + istem +7,03 [+2,15, +11,91] anlamlı.** Kıyasta 0,40 vs +0,80 +2,45 [+0,46, +4,45] anlamlı; 0,40 vs 0,75 +1,99 [+0,00, +3,99] sınırda. +(Önceki taslakta 0,75 + istem, 0,40 *istemsiz* ile karşılaştırılmış ve fark +gösterilememişti; o karşılaştırma yapılandırmaları eşleştirmiyordu.) + +**Zorunlu seçim, v2, n=502 (312 gerçek, 190 uydurma), az-örnek sızıntısız:** + +| Ölçek | Toplam | Gerçek | Uydurma | +|---|---|---|---| +| taban | %89,44 | %94,55 | %81,05 | +| 0,40 | %89,84 · +0,40 [−1,20, +2,19] | %95,19 · +0,64 [−0,64, +1,92] | %81,05 · 0,00 | +| 0,75 | %91,43 · +1,99 [−0,20, +4,18] | %96,47 · +1,92 [−0,32, +4,17] | %83,16 · +2,11 [−2,11, +6,32] | +| 0,80 | %91,83 · +2,39 [+0,20, +4,78] | %97,12 · +2,56 [+0,64, +4,81] | %83,16 · +2,11 [−2,63, +6,84] | + +v1'deki "+3,73 anlamlı" morfoloji üstünlüğü v2'de yoktur: 0,40'ta fark +gösterilemez, 0,80'de küçük ve sınırdadır, uydurma gövdelerde hiçbir noktada +gösterilemez. Devam-eğitimi Türkçe bilgiyi artırmış, ek sistemini ölçülebilir +biçimde değiştirmemiştir. + +**Kimlik**: sistem istemiyle 0,40 / 0,75 / 0,80 / 1,00 → 30/30. + +**Nihai seçim: 0,75 + sistem istemi.** Bu protokolün kuralı, aralığı sıfırı +içeren farkın gösterilemediğidir. Dağıtım yapılandırmasında (istemli) +0,75, üretimde 0,40'ı +10,35 [+5,47, +15,43] ile anlamlı geçer; 0,40'ın +kıyastaki üstünlüğü +1,99 [+0,00, +3,99] ile gösterilemez. Kimlik her +noktada tamdır. Önceki taslak 0,40'ı seçmişti; o seçim 0,75 + istemi 0,40 +istemsizle karşılaştıran eşleşmeyen bir kıyasa dayanıyordu ve 0,40 + istem +ölçülünce (%49,02) geri alındı. Başlık sayısı 0,75'in sayısıdır; 0,40 ve +0,80 satırları tabloda kalır. + +--- + +## 5. Sonuçlar + +**Kıyas bilgisi** (TurkishMMLU, temiz 652, döndürülmüş) + +| Model | Doğruluk | +|---|---| +| Taban Qwen3-14B | %60,58 | +| Erk-14B (aynı protokol; kendi kartında tam küme, döndürmesiz 0-shot: %69,7) | %67,18 | +| Taban Qwen3-32B | %67,64 | +| Erk-32B (0,40, ek tur öncesi) | %73,16 | +| Erk-32B (0,40, LoRA yolu) | %73,47 | +| Erk-32B (0,40, birleşik; önceki aday) | %73,16 | +| Erk-32B (0,75, LoRA yolu) | %71,47 | +| **Erk-32B (0,75, yayınlanan birleşik ağırlık)** | **%71,01** | + +Birleştirme (`W = W_taban + 0,75 × LoRA`, fp32 çarpım, tek bf16 yuvarlama) +aynı ölçüm betiğiyle yeniden ölçüldü: LoRA yoluyla 652 sorunun 649'unda, +329 üretim maddesinin 313'ünde aynı cevap; farklar −0,46 [−1,07, +0,00] ve +0,00 [−2,43, +2,43], yuvarlama yolu. Başlık sayısı yayınlanan ağırlığın kendi +ölçümüdür. + +| Karşılaştırma | Fark | %95 GA | +|---|---|---| +| **Erk-32B (birleşik 0,75) vs kendi tabanı** | **+3,37** | **[+0,61, +6,13]** | +| Erk-32B (LoRA yolu 0,75) vs kendi tabanı | +3,83 | [+0,92, +6,90] | +| Erk-32B (LoRA yolu 0,40) vs kendi tabanı | +5,83 | [+3,22, +8,44] | +| Erk-32B LoRA 0,40 vs birleşik 0,75 | +2,45 | [+0,46, +4,60] | +| Erk-32B LoRA 0,40 vs LoRA 0,75 | +1,99 | [+0,00, +3,99] gösterilemedi | +| Erk-32B 0,40 vs 0,80 | +2,45 | [+0,46, +4,45] | +| Erk-14B vs kendi tabanı | +6,60 | [+3,07, +10,28] | +| Taban 32B vs taban 14B (ölçek etkisi) | +7,06 | [+3,53, +10,74] | + +**Morfoloji** (TurkMorfBench v2, zorunlu seçim, 502 madde; az-örnek gövdeleri +kıyas dışından) + +| Küme | Taban | **Erk-32B (0,75)** | Fark | %95 GA | +|---|---|---|---|---| +| Toplam (502) | %89,44 | %91,43 | +1,99 | [−0,20, +4,18] gösterilemedi | +| Gerçek kelime (312) | %94,55 | %96,47 | +1,92 | [−0,32, +4,17] gösterilemedi | +| Uydurma kelime (190) | %81,05 | %83,16 | +2,11 | [−2,11, +6,32] gösterilemedi | + +İşletme noktasında morfoloji farkı **gösterilememektedir** (alt sınırlar +sıfırın hemen altında). v1 kıyasıyla raporlanmış olan +3,73 [+0,93, +6,83] +değeri altın cevap hatalarının ürünüdür (4.2, 8. bölüm). 0,80'de küçük bir +fark görülür (+2,39 [+0,20, +4,78]); 0,40'ta hiç yoktur (+0,40). + +Uydurma kelime testi kuralın **üretkenliğini** ölçer; hiçbir ölçekte fark +gösterilememiştir. Bulgu: devam-eğitimi Türkçe bilgiyi geliştirmiş, ek +sistemini ölçülebilir biçimde değiştirmemiştir. Örneklem küçüktür (n=190, +±3,7); "fark yok" değil, "gösterilemiyor" geçerlidir. + +**Üretim (talimat izleme)** (TurkMorfBench v2, 512 madde, tam eşleşme, +dağıtım yapılandırması = sistem istemli): taban %31,64 → Erk-32B 0,75 + istem +**%59,38**, +27,73 [+22,46, +33,01]. Bu eksen bilgiyle birlikte biçime uymayı +ölçer; taban model düşünme bloğunda kalıp cevap vermediği için düşüktür. + +**Kimlik** (30 soru, tuzak sorular dahil): 0,75 + sistem istemi 30/30. + +--- + +## 6. Bilinen sınırlar + +1. **Tek tohum.** Tüm sonuçlar tek eğitim koşusundan. Bootstrap aralıkları + soru örneklemesinin belirsizliğini kapsar, eğitim tohumununkini kapsamaz. + 32B ölçeğinde çok tohumlu koşu mevcut bütçeyle mümkün değildir. +2. **Taban model bize ait değildir.** +3. **Kirlilik üst sınırı** — denetim soru metnini arar, cevap anahtarını değil. +4. **Taban modelin külliyatı denetlenemez.** Karşılaştırma "temiz vs kirli" + değil, iki tarafın da bilinmeyen ölçüde kirli olduğu varsayımıyla yapılır. +5. **Morfoloji kıyasının kapsamı** kurallı gövdelerle sınırlıdır; ünlü + düşmesi gibi sözlüksel istisnalar bilinçli olarak dışarıda bırakılmıştır. +6. **Ölçüm sayısı sınırlıdır**: iki eksen (çoktan seçmeli bilgi, morfoloji) + ve bir kullanılabilirlik testi. Üretim kalitesi, uzun bağlam, kod, akıl + yürütme ölçülmemiştir. +7. **Kimlik sistem istemine bağlıdır.** Ağırlıklardaki kimlik 0,75'te + 30 soruda 8/30, 0,80'de 12/30'dur; istemsiz dağıtımda model taban + modelin kimliğini söyler. + Şablon varsayılan istemi taşır; kullanıcı kendi sistem mesajını verirse + varsayılan devreye girmez. +8. **Morfoloji kazancı gösterilememiştir.** İlk sürüm kıyasıyla raporlanan + fark altın cevap hatalarıydı; v2'de 0,75'te alt sınır sıfırın altındadır. +9. **İşletme noktası iki kez değişti** (0,40 → 0,80 → 0,40 → 0,75). Her + değişiklik bir ölçüm hatasının düzeltilmesinden geldi (4.1, 4.2, 8. bölüm); + eğrinin kendisi tek checkpoint'ten ve tek tohumdandır. +10. **Üretim ekseni morfoloji sorularıyla sınırlıdır.** "Talimat izleme" + genel sohbet kalitesi değil, morfoloji sorularına biçime uyarak cevap + verme oranıdır. + +--- + +## 7. Yeniden üretim + +| Aşama | Betik | +|---|---| +| Külliyat dökümü | `kulliyat_dokumu.py` | +| SFT denetimi ve temizliği | `sft_clean.py`, `sft_repair.py` | +| Devam-eğitimi | `cpt32b_train.py` | +| Talimat ayarı | `sft32b_train.py` | +| Kirlilik denetimi | `kirlilik_denetimi.py` | +| Kıyas ölçümü | `eval32b_heldout.py` | +| Permütasyon testi | `permutasyon_testi.py` | +| Morfoloji (zorunlu seçim) | `morfbench_zorunlu.py` | +| Talimat izleme | `sohbet_talimat.py` | +| Ölçek taraması | `olcek_ince.py` | +| Ek tur sonrası tarama | `olcek_ince_sft2.py`, `olcek_ince_sft2_ince.py`, `olcek_sistem_080.py` | +| v2 taraması ve istemli noktalar | `olcek_v2.py`, `olcek_sistem_v2.py` (0,80), `_075`, `_040` türevleri; `bootstrap_sis040.py` | +| GGUF üretim ve doğrulama | `gguf_uret.py` (BF16 → Q8_0, Q4_K_M; kimlik + NLL), `sablon_yama.py` (varsayılan kimlik istemi) | +| Kimlik sınavı (30 soru) | `kimlik_sinavi_genis.py`, `kimlik_sistem_istemi.py` | +| Eşli bootstrap | `bootstrap_sft2.py`, `bootstrap_ince.py`, `bootstrap_sistem.py`, `bootstrap_birlesik.py` | +| Morfoloji, ölçekli | `morfbench_olcek.py` (CK_DIR, OLCEK) | +| Birleştirme ve doğrulama | `birlestir.py`, `olcek_birlesik.py` | + +Tüm ölçüm çıktıları soru-bazlı tahmin vektörleriyle JSON olarak saklanır; +eşleştirilmiş karşılaştırmalar modeli yeniden çalıştırmadan yapılabilir. + +--- + +## 8. Ölçüm günlüğü — düzeltilen sayılar + +Bu bölüm, ham ölçümlerin neden doğrudan raporlanmadığını gösterir. + +| Ham sayı | Sebep | Düzeltilmiş | +|---|---|---| +| +6,27 | kirli sorular dahildi | +4,14 | +| +36,17 | biçim uyumu bilgi sanıldı | +3,73 | +| +53,80 | üretim token sınırında kesildi | ölçülemez | +| 7.171 saat (EEG) | sinyalsiz dosyalar sayıldı | 5.247 saat | +| −5,78 (sohbet kaybı) | ölçek 1,00'da ölçüldü | 0,40'ta kayıp yok | +| −1,69 (ek tur "gerilemesi") | 1,00 sonucu 0,40 sonucuyla kıyaslandı | aynı ölçekte +0,46, gürültü | +| kimlik 1/5 | sınav 0,40'ta, kimlik 1,00'da öğrenilmişti | 1,00'da 28/30; istemle 30/30 | +| kimlik "2/5, kısmi" (0,80) | 5 soruluk sınav | 30 soruda 12/30 | +| %71,01 (0,80 kıyas) | LoRA yolu; birleşik ağırlık değil | birleşik %71,32, 650/652 aynı (yuvarlama) | +| %73,47 (0,40 kıyas) | LoRA yolu; yayınlanan birleşik ağırlık değil | birleşik %73,16, 646/652 aynı (yuvarlama) | +| %71,47 (0,75 kıyas) | LoRA yolu; yayınlanan birleşik ağırlık değil | birleşik %71,01, 649/652 aynı (yuvarlama) | +| +3,73 morfoloji (v1) | kıyasın 18 altın cevabı yanlıştı | v2'de +0,40, gösterilemedi | +| +8,81 (0,80 vs 0,40 üretim, v1) | aynı altın cevap hataları | v2'de +1,56, gösterilemedi; seçim 0,40'a döndü | +| +3,52 "gösterilemedi" (0,75+istem vs 0,40) | istemli nokta istemsizle kıyaslanmıştı | 0,40+istem %49,02; 0,75+istem vs 0,40+istem +10,35 [+5,47, +15,43]; seçim 0,75 | +| GGUF kimlik 4/6 | denetleyici "ben ChatGPT değilim" cevabında adı sayıyordu | kural düzeltildi, 6/6 (üç nicem) | +| zorunlu seçim az-örnek istemi | kalem/defter/bardak kıyas gövdesiydi | kıyas dışı gövdelerle yeniden ölçüldü | +| "kesik" sütunu | yığın-bazlı sayım, üst sınır | kaldırıldı | + +Hiçbiri dışarıdan bildirilmedi; hepsi yayımdan önce kendi denetimimizde +bulundu. diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..8843957fb49a09d36dca732e7700a6b148e1a4f0 --- /dev/null +++ b/README.md @@ -0,0 +1,180 @@ +--- +license: apache-2.0 +language: + - tr +base_model: Qwen/Qwen3-32B +pipeline_tag: text-generation +library_name: transformers +tags: + - turkish + - türkçe + - qwen3 + - continued-pretraining + - lora + - turkish-llm + - türkçe-dil-modeli + - gguf +model-index: + - name: Erk-32B + results: + - task: + type: multiple-choice + name: TurkishMMLU (temiz-652, şık döndürmeli) + dataset: + name: TurkishMMLU + type: AYueksel/TurkishMMLU + metrics: + - type: accuracy + value: 71.01 + name: doğruluk (temiz 652) +--- + + +# Erk-32B — Türkçe dil modeli, ölçüm protokolüyle + +Erk-32B, açık kaynaklı **Qwen3-32B** temel modeli üzerine 1,05 milyar token Türkçe +devam-eğitimi ve 423 milyon token Türkçe talimat ayarı uygulanarak eCloud Tech. +tarafından geliştirilmiş bir Türkçe dil modelidir. Bu sayfadaki her sayı, +**kirlilik denetimi, şık döndürme, zorunlu seçim ve eşli bootstrap güven +aralığı** elemelerinden geçmiştir; ölçüm protokolü, düzeltilen ham sayılar ve +yeniden üretim betikleri depoda açıktır. + +*English summary at the end.* + +## Sonuçlar (işletme noktası: LoRA ölçeği 0,75 + sistem istemi, birleşik ağırlık) + +| Ölçüm | Taban Qwen3-32B | **Erk-32B** | Fark | %95 GA | +|---|---|---|---|---| +| TurkishMMLU, temiz 652, şık döndürmeli | %67,64 | **%71,01** | +3,37 | [+0,61, +6,13] | +| TurkMorfBench v2 üretim (512, tam eşleşme, sistem istemli) | %31,64 | **%59,38** | +27,73 | [+22,46, +33,01] | +| TurkMorfBench v2 zorunlu seçim, toplam (502) | %89,44 | %91,43 | +1,99 | [−0,20, +4,18] gösterilemedi | +| TurkMorfBench v2 zorunlu seçim, gerçek kelime (312) | %94,55 | %96,47 | +1,92 | [−0,32, +4,17] gösterilemedi | +| TurkMorfBench v2 zorunlu seçim, uydurma (190) | %81,05 | %83,16 | +2,11 | [−2,11, +6,32] gösterilemedi | +| Kimlik (30 soru, tuzaklı, sistem istemli) | — | **30/30** | | | + +Aynı protokolde ölçek karşılaştırması (temiz 652): Qwen3-14B %60,58 · Erk-14B +%67,18 · Qwen3-32B %67,64 · Erk-32B %71,01. (Birleşik ağırlık LoRA yoluyla +649/652 aynı cevap; 0,40 ölçeğinde %73,47 — kıyasta sınırda daha iyi, üretimde +10 puan geri; iki nokta da raporda.) [Erk-14B'nin kendi kartındaki +%69,7](https://huggingface.co/ecloudtech/Erk-14B), tam kümede, şık döndürmesiz, +lm-evaluation-harness 0-shot ölçümüdür; buradaki %67,18 aynı modelin kirlilik +dışı bırakılmış, döndürülmüş ölçümüdür. Fark protokolden gelir, modelden değil. + +Ne **söylemiyoruz**: morfoloji bilgisinde (zorunlu seçim) tabandan fark +gösterilemedi — alt sınırlar sıfırın hemen altında, uydurma gövdelerde hiç. +Devam-eğitimi Türkçe *bilgiyi* geliştirmiş, ek sistemini ölçülebilir biçimde +değiştirmemiştir. Üretim eksenindeki +28 puan büyük ölçüde biçim uyumudur +(taban model düşünme bloğunda kalıp cevap yazmıyor). Tek eğitim tohumu; güven +aralıkları soru örneklemesini kapsar, tohumu kapsamaz. + +## İşletme noktası nasıl seçildi + +LoRA toplamsal olduğu için (`W = W_taban + s · LoRA`) ölçek *s* eğitim sonrası +bir ayar düğmesidir. On iki noktada üç eksen ölçüldü; kimlik sistem istemiyle +verildiğinden karşılaştırma **istemli** noktalar arasında yapıldı. Üretimde +0,75 + istem, 0,40 + istemi +10,35 [+5,47, +15,43] ile anlamlı geçer; kıyasta +0,40'ın üstünlüğü +1,99 [+0,00, +3,99] ile gösterilemez. Aralığı sıfırı +içeren fark bu protokolde "gösterilemedi" sayıldığından **0,75** seçildi; +0,40 ve 0,80 satırları raporda durur. Ayrıntı: `OLCUM-PROTOKOLU.md` §4.2. + +## Kimlik ve sistem istemi + +Kimlik ağırlıklara işlenmemiştir; sohbet şablonundaki **varsayılan sistem +istemi** ile verilir. Kullanıcı kendi sistem mesajını verirse varsayılan +devreye girmez. İstem, taban modeli açıkça söyler: + +> Sen Erk-32B'sin: eCloud Tech. tarafından, açık kaynaklı Qwen3-32B temel modeli +> üzerine Türkçe devam-eğitimi ve talimat ayarıyla geliştirilmiş 32 milyar +> parametreli bir Türkçe dil modelisin. … + +## Kullanım + +```python +from transformers import AutoModelForCausalLM, AutoTokenizer +m = "ecloudtech/Erk-32B" +tok = AutoTokenizer.from_pretrained(m) +model = AutoModelForCausalLM.from_pretrained(m, torch_dtype="auto", device_map="auto") +msgs = [{"role": "user", "content": "Türkçede ünsüz yumuşaması nedir? /no_think"}] +ids = tok.apply_chat_template(msgs, add_generation_prompt=True, return_tensors="pt").to(model.device) +print(tok.decode(model.generate(ids, max_new_tokens=300)[0][ids.shape[1]:], skip_special_tokens=True)) +``` + +Qwen3 hibrit düşünme modu korunur: `/no_think` ile kapatılır. GGUF sürümleri +(Q8_0, Q4_K_M) llama.cpp / Ollama / LM Studio ile çalışır; nicemleme +doğrulaması (kimlik ve NLL) model kartının sonundadır. + +## Eğitim + +| | | +|---|---| +| Taban | Qwen3-32B (Apache 2.0) | +| Devam-eğitimi | 1,05B Türkçe web token · LoRA r=256 α=512 · 32.000 adım | +| Talimat ayarı | 423M token, 373.387 örnek (temizlenmiş) · 2 tur | +| Ek tur | kimlik 6.000 + morfolojik hata düzeltme 40.000 · 1.673 adım | +| Donanım | 4×A100-80GB, FSDP, bf16 · ≈37.000 çekirdek-saat | +| Yayın ağırlığı | LoRA 0,75 ile birleştirilmiş (fp32 çarpım, tek bf16 yuvarlama); LoRA yoluyla eşdeğerlik aynı ölçüm betiğiyle doğrulanır | +| GGUF | Q8_0 34,8 GB (NLL +%0,04) · Q4_K_M 19,8 GB (NLL +%0,85); BF16 referansına göre, 6.132 belirteçlik Türkçe metinde; her nicemde kimlik 6/6 | + +Talimat külliyatında kod içeren cevapların %53,5'i makine çevirisiyle bozuktu; +temizlik ve onarım betikleri depodadır. Talimat külliyatında kıyas kirliliği +n=13 eşiğinde 0/900. + +## Ölçüm protokolü — kısa + +1. **Kirlilik**: TurkishMMLU'nun 900 sorusundan 113'ü devam-eğitimi külliyatında + birebir geçiyor (13-kelime pencere); bunlar ve 150 soruluk ayar kümesi + dışarıda → temiz 652. Liste: `turkishmmlu-kirlilik` deposu. +2. **Şık döndürme**: her soru şık sırası döndürülerek ölçülür; harf/konum + yanlılığı elenir. +3. **Zorunlu seçim vs üretim**: biçim uyumu bilgiden ayrılır (üretimde +28 + puan görünen fark zorunlu seçimde +2,0, gösterilemedi). +5. **Kıyasın kendisi denetlenir**: morfoloji kıyasının ilk sürümünde 18 yanlış + altın cevap bulundu; tüm sayılar düzeltilmiş v2 ile yeniden ölçüldü ve v1 + ile raporlanmış +3,73'lük "morfoloji üstünlüğü" geri çekildi. +4. **Eşli bootstrap**: 10.000 yeniden örnekleme; aralığı sıfırı içeren fark + "gösterilemedi" olarak yazılır. + +Düzeltilen ham sayıların günlüğü (`OLCUM-PROTOKOLU.md` §8) on iki kalem içerir; +hiçbiri dışarıdan bildirilmedi. + +## Sınırlar + +- Tek tohum; tohumlar arası varyans ölçülmedi. +- Üretim kalitesi, uzun bağlam, kod ve akıl yürütme ölçülmedi. +- Kimlik sistem istemine bağlıdır; istemsiz dağıtımda model taban modelin kimliğini söyler. +- Morfoloji bilgisinde kazanç gösterilememiştir; üretim eksenindeki fark biçim uyumunu içerir. +- Taban modelin külliyatı denetlenemez; karşılaştırma iki tarafın da bilinmeyen ölçüde kirli olduğu varsayımıyla yapılır. + +## Depo içeriği + +`OLCUM-PROTOKOLU.md` tam rapor (8 bölüm, ölçüm günlüğü dahil) · `betikler/` +eğitim, temizlik, ölçüm, tarama, bootstrap, birleştirme ve GGUF betikleri (34 +dosya, llama.cpp sürümü sabitlenmiş) · `sonuclar/` soru-bazlı tahmin vektörleri +(17 JSON; eşli karşılaştırmalar model çalıştırmadan yeniden yapılabilir) · +`README-GGUF.md` nicemlenmiş sürümlerin kartı. Kardeş depolar: +**TurkMorfBench** (kıyas + üretici + denetim betikleri) ve **TurkishMMLU +kirlilik listesi**. + +Lisans Apache 2.0 (taban modelle aynı). İletişim: info@e-cloud.web.tr + +--- + +## English summary — Erk-32B + +Erk-32B is Qwen3-32B continued-pretrained on 1.05B tokens of Turkish and +instruction-tuned on 423M tokens (373k cleaned examples), released as merged +weights at LoRA scale 0.75 with a default identity system prompt and GGUF +quantizations (Q8_0, Q4_K_M). Every reported number passed a contamination audit +(113/900 TurkishMMLU questions found verbatim in the training corpus and +excluded), option rotation, forced-choice measurement and paired bootstrap CIs. +On clean TurkishMMLU (652 items) the released merged weights score 71.01% vs +67.64% for the base (+3.37 [+0.61, +6.13]); on TurkMorfBench v2 generation with the system prompt +59.38% vs 31.64% (+27.73 [+22.46, +33.01]). On forced choice the gain over the +base is not demonstrable (+1.99 [−0.20, +4.18]); a +3.73 advantage reported +with the benchmark's first version was traced to 18 wrong gold answers and +withdrawn. Scale 0.40 scores 73.47% on TurkishMMLU (a borderline +1.99 over +0.75) but 10 points lower on generation with the system prompt; both rows are +in the report. Identity is +provided by a default system prompt in the chat template and states the base +model explicitly. Single training seed; generation quality, long context, code +and reasoning were not measured. Apache 2.0. diff --git a/betikler/birlestir.py b/betikler/birlestir.py new file mode 100644 index 0000000000000000000000000000000000000000..893f1093a368646487b41375f13dd0159f797dbe --- /dev/null +++ b/betikler/birlestir.py @@ -0,0 +1,75 @@ +"""LoRA'yi tabana BIRLESTIR: W = W_taban + OLCEK * (B @ A) * (alpha / r). + +NEDEN: yayin icin tek parca model gerekiyor. LoRA + taban ikilisi calisma +noktasini kullaniciya birakir; birlesik model 0,80'i agirliga isler. + +DOGRULAMA SART: birlestirme bf16'da yapilirsa (B@A) carpimi ve toplama ayri +ayri yuvarlanir; LoRA yolundaki x@A^T@B^T sirasindan farkli bir yuvarlama +olur. Fark kucuk ama sifir degil. Bu yuzden carpim fp32'de yapilir, sonuc +bf16'ya tek seferde yuvarlanir; ve birlesik model AYNI kiyas betigiyle +yeniden olculur (olcek 0,0 = "LoRA yok" = birlesik agirligin kendisi). +Beklenen: sohbet %69,00 / kiyas %71,01 (0,80 istemsiz satiri). Sapma +bootstrap gurultusunun disindaysa yayinlanmaz. + +Cikti: safetensors + tokenizer, save_pretrained ile. LoRA anahtarlari +'model.layers.N.self_attn.q_proj.A' bicimindedir; taban agirligi +'model.layers.N.self_attn.q_proj.weight'. Eslesmeyen anahtar HATA'dir, +sessizce atlanmaz. +""" +import os, sys, json, time, torch +from transformers import AutoModelForCausalLM, AutoTokenizer + +MID = "/ari/users/ytanis/qwen3-32b" +CK = os.environ.get("CK_DIR", "/ari/users/ytanis/erk32b-sft2") +OLCEK = float(os.environ.get("OLCEK", "0.80")) +CIKTI = os.environ.get("CIKTI", "/ari/users/ytanis/erk32b-birlesik-080") +R, ALPHA = 256, 512 +S = ALPHA / R + +t0 = time.time() +print("taban yukleniyor (CPU, bf16)...", flush=True) +model = AutoModelForCausalLM.from_pretrained(MID, torch_dtype=torch.bfloat16, device_map="cpu") +tok = AutoTokenizer.from_pretrained(MID) +sd = model.state_dict() + +lsd = torch.load("%s/lora_ck.pt" % CK, map_location="cpu", weights_only=True) +print("LoRA tensor: %d | olcek %.2f | %.0f sn" % (len(lsd), OLCEK, time.time() - t0), flush=True) + +# A ve B'yi modul basina esle +modul = {} +for k, v in lsd.items(): + if k.endswith(".A") or k.endswith(".B"): + modul.setdefault(k[:-2], {})[k[-1]] = v + else: + raise SystemExit("beklenmeyen LoRA anahtari: %s" % k) + +birlesen = 0; norm_top = 0.0 +for ad, ab in modul.items(): + if "A" not in ab or "B" not in ab: + raise SystemExit("eksik A/B: %s" % ad) + hedef = ad + ".weight" + if hedef not in sd: + raise SystemExit("taban agirligi bulunamadi: %s" % hedef) + A = ab["A"].float(); B = ab["B"].float() # fp32'de carp + delta = (B @ A) * (S * OLCEK) + if delta.shape != sd[hedef].shape: + raise SystemExit("sekil uyusmuyor %s: %s vs %s" % (hedef, tuple(delta.shape), tuple(sd[hedef].shape))) + yeni = (sd[hedef].float() + delta).to(torch.bfloat16) # tek yuvarlama + with torch.no_grad(): + sd[hedef].copy_(yeni) + norm_top += delta.norm().item(); birlesen += 1 + if birlesen % 100 == 0: + print(" %d/%d modul | %.0f sn" % (birlesen, len(modul), time.time() - t0), flush=True) + +print("birlesen modul: %d | toplam delta normu: %.2f" % (birlesen, norm_top), flush=True) +if birlesen != len(modul) or birlesen == 0: + raise SystemExit("birlestirme eksik") + +os.makedirs(CIKTI, exist_ok=True) +model.save_pretrained(CIKTI, safe_serialization=True, max_shard_size="5GB") +tok.save_pretrained(CIKTI) +json.dump({"taban": MID, "lora": CK, "olcek": OLCEK, "r": R, "alpha": ALPHA, + "birlesen_modul": birlesen, "delta_norm_toplam": norm_top, + "not": "carpim fp32, tek bf16 yuvarlama; kiyas dogrulamasi ayri betikte"}, + open(os.path.join(CIKTI, "birlestirme.json"), "w"), indent=1) +print("KAYDEDILDI -> %s | %.0f sn" % (CIKTI, time.time() - t0), flush=True) diff --git a/betikler/bootstrap_birlesik.py b/betikler/bootstrap_birlesik.py new file mode 100644 index 0000000000000000000000000000000000000000..1e9ca8961cfc35e8dea025144203cdb868077629 --- /dev/null +++ b/betikler/bootstrap_birlesik.py @@ -0,0 +1,12 @@ +"""Birlesik model (olcek 0,0 = agirlikta 0,80) vs LoRA yolu (0,80): ayni soru vektorleri, esli.""" +import json, numpy as np +A = json.load(open("/ari/users/ytanis/olcek_ince_sft2.json"))["0.80"] +B = json.load(open("/ari/users/ytanis/olcek_birlesik_080.json"))["0.00"] +rng = np.random.default_rng(0); N = 10000 +for ad, k in (("SOHBET", "sohbet_vec"), ("KIYAS", "mmlu_vec")): + x = np.asarray(B[k], float); y = np.asarray(A[k], float); n = len(x) + ayni = int((x == y).sum()) + idx = rng.integers(0, n, size=(N, n)); d = (x[idx].mean(1) - y[idx].mean(1)) * 100 + lo, hi = np.percentile(d, [2.5, 97.5]) + print(" %-7s birlesik vs LoRA: %+5.2f [%+5.2f, %+5.2f] ayni cevap %d/%d %s" + % (ad, (x.mean()-y.mean())*100, lo, hi, ayni, n, "ANLAMLI" if (lo > 0 or hi < 0) else "gurultu")) diff --git a/betikler/bootstrap_ince.py b/betikler/bootstrap_ince.py new file mode 100644 index 0000000000000000000000000000000000000000..2672f8cc2300ee111f8ac77acc447e43d1f5d856 --- /dev/null +++ b/betikler/bootstrap_ince.py @@ -0,0 +1,16 @@ +"""0,75-0,80 sohbet tepesi gercek mi? Kaba ve ince taramayi birlestirip esli bootstrap.""" +import json, numpy as np +A = json.load(open("/ari/users/ytanis/olcek_ince_sft2.json")) +A.update(json.load(open("/ari/users/ytanis/olcek_ince_sft2_ince.json"))) +rng = np.random.default_rng(0); N = 10000 +def satir(ad, x, y): + x = np.asarray(x, float); y = np.asarray(y, float); n = len(x) + idx = rng.integers(0, n, size=(N, n)); d = (x[idx].mean(1) - y[idx].mean(1)) * 100 + lo, hi = np.percentile(d, [2.5, 97.5]) + print(" %-30s %+6.2f [%+6.2f, %+6.2f] %s" % (ad, (x.mean()-y.mean())*100, lo, hi, "ANLAMLI" if (lo > 0 or hi < 0) else "-")) +print("SOHBET (n=329, esli)") +for a, b in [("0.75","0.00"),("0.80","0.00"),("0.85","0.00"),("0.75","0.40"),("0.80","0.85"),("0.80","0.75"),("1.00","0.00")]: + satir("%s vs %s" % (a, b), A[a]["sohbet_vec"], A[b]["sohbet_vec"]) +print("KIYAS (n=652, esli)") +for a, b in [("0.40","0.75"),("0.40","0.80"),("0.75","0.00"),("0.80","1.00")]: + satir("%s vs %s" % (a, b), A[a]["mmlu_vec"], A[b]["mmlu_vec"]) diff --git a/betikler/bootstrap_sft2.py b/betikler/bootstrap_sft2.py new file mode 100644 index 0000000000000000000000000000000000000000..cfec9e558950206e5b3f8a421583e98e5e40e9a0 --- /dev/null +++ b/betikler/bootstrap_sft2.py @@ -0,0 +1,46 @@ +"""Ek tur sonrasi olcek taramasi — esli bootstrap guven araliklari. + +Soru-bazli vektorler ayni sorular uzerinde oldugu icin fark ESLI hesaplanir: +her yeniden orneklemede ayni soru indeksleri iki kosula da uygulanir. Bagimsiz +bootstrap'a gore araliklar daha dar ve dogru olur (soru zorlugu ortak varyans). +10.000 yeniden ornekleme, tohum 0 — OLCUM-PROTOKOLU ile ayni. +""" +import json, numpy as np + +A = json.load(open("/ari/users/ytanis/olcek_ince_sft2.json")) # ek tur SONRASI +try: + B = json.load(open("/ari/users/ytanis/olcek_ince.json")) # ek tur ONCESI +except Exception: + B = {} +rng = np.random.default_rng(0) +N = 10000 + +def ci(x, y): + x = np.asarray(x, float); y = np.asarray(y, float); n = len(x) + assert n == len(y) + idx = rng.integers(0, n, size=(N, n)) + d = (x[idx].mean(1) - y[idx].mean(1)) * 100 + lo, hi = np.percentile(d, [2.5, 97.5]) + return (x.mean() - y.mean()) * 100, lo, hi + +def satir(ad, x, y): + f, lo, hi = ci(x, y) + anl = "ANLAMLI" if (lo > 0 or hi < 0) else " - " + print(" %-40s %+6.2f [%+6.2f, %+6.2f] %s" % (ad, f, lo, hi, anl)) + +print("EK TUR SONRASI — olcekler arasi (esli, n_sohbet=329, n_kiyas=652)") +print(" SOHBET") +for a, b in [("0.80", "0.00"), ("1.00", "0.00"), ("0.40", "0.00"), ("0.80", "0.40"), ("0.80", "1.00")]: + satir("sohbet %s vs %s" % (a, b), A[a]["sohbet_vec"], A[b]["sohbet_vec"]) +print(" KIYAS") +for a, b in [("0.40", "0.00"), ("0.80", "0.00"), ("1.00", "0.00"), ("0.40", "0.80"), ("0.40", "1.00")]: + satir("kiyas %s vs %s" % (a, b), A[a]["mmlu_vec"], A[b]["mmlu_vec"]) + +if B: + print("\nEK TUR SONRASI vs ONCESI — ayni olcekte (esli)") + for o in ["0.40", "0.50", "1.00"]: + if o in B: + satir("sohbet %s: sonra vs once" % o, A[o]["sohbet_vec"], B[o]["sohbet_vec"]) + satir("kiyas %s: sonra vs once" % o, A[o]["mmlu_vec"], B[o]["mmlu_vec"]) + else: + print(" (%s once dosyasinda yok)" % o) diff --git a/betikler/bootstrap_sistem.py b/betikler/bootstrap_sistem.py new file mode 100644 index 0000000000000000000000000000000000000000..99c814e68f5504cd29ac0ed3f105f8ea54383139 --- /dev/null +++ b/betikler/bootstrap_sistem.py @@ -0,0 +1,15 @@ +import json, numpy as np +A = json.load(open("/ari/users/ytanis/olcek_ince_sft2.json")) +S = json.load(open("/ari/users/ytanis/olcek_sistem_080.json"))["0.80"] +rng = np.random.default_rng(0); N = 10000 +def satir(ad, x, y): + x = np.asarray(x, float); y = np.asarray(y, float); n = len(x) + idx = rng.integers(0, n, size=(N, n)); d = (x[idx].mean(1) - y[idx].mean(1)) * 100 + lo, hi = np.percentile(d, [2.5, 97.5]) + print(" %-34s %+6.2f [%+6.2f, %+6.2f] %s" % (ad, (x.mean()-y.mean())*100, lo, hi, "ANLAMLI" if (lo > 0 or hi < 0) else "-")) +print("SOHBET (n=329, esli)") +satir("0.80+sistem vs taban", S["sohbet_vec"], A["0.00"]["sohbet_vec"]) +satir("0.80+sistem vs 0.80 istemsiz", S["sohbet_vec"], A["0.80"]["sohbet_vec"]) +satir("0.80+sistem vs 0.40 istemsiz", S["sohbet_vec"], A["0.40"]["sohbet_vec"]) +print("KIYAS (n=652, esli)") +satir("0.80+sistem vs taban", S["mmlu_vec"], A["0.00"]["mmlu_vec"]) diff --git a/betikler/cpt32b_train.py b/betikler/cpt32b_train.py new file mode 100644 index 0000000000000000000000000000000000000000..ee6c5f55308a5c260b4de6df13f85ec6ce068eb6 --- /dev/null +++ b/betikler/cpt32b_train.py @@ -0,0 +1,185 @@ +"""Erk-32B CPT — FSDP LoRA (r=256, tum lineer), checkpoint'li/kaldigi-yerden-devam. +Veri: tok_train.txt (~1B token) x2 epoch. Probe: TurkishMMLU DEV (test'e hic bakilmaz). +Kullanim: torchrun --nproc_per_node=4 cpt32b_train.py +""" +import os, sys, time, math, json, glob, functools, torch, torch.nn as nn, torch.distributed as dist +from torch.distributed.fsdp import FullyShardedDataParallel as FSDP, MixedPrecision, StateDictType +from torch.distributed.fsdp.wrap import transformer_auto_wrap_policy +from transformers import AutoModelForCausalLM, AutoTokenizer +from transformers.models.qwen3.modeling_qwen3 import Qwen3DecoderLayer +os.environ["HF_DATASETS_OFFLINE"]="1" + +dist.init_process_group("nccl") +rank=dist.get_rank(); local=int(os.environ["LOCAL_RANK"]); W=dist.get_world_size() +torch.cuda.set_device(local) +MID="/ari/users/ytanis/qwen3-32b"; OUT="/ari/users/ytanis/erk32b-cpt" +SEQ=2048; BS=4; R=256; ALPHA=512; LR=1e-4; WARMUP=200 +# Tam program korunuyor. Kisaltma dusunuldu ve reddedildi: gerekce dev-150 +# probe'unun 73-78 bandinda salinmasiydi, ancak 150 soruda %95 belirsizlik +# ±7 puan — bu salinim yavas ve gercek bir tirmanisla da uyumlu. Doyum +# kaniti yok. Karar bunun yerine OLCUME baglandi: her parca sonunda +# held-out 750 (bkz. eval32b_heldout.py, parca basina <200 cekirdek-saat, +# parca maliyetinin ~%3'u). Ust uste iki olcum guven araligi icinde kalirsa +# program orada kesilir. +TOTAL_TOKENS=2_100_000_000 +STEP_TOKENS=SEQ*BS*W +TOTAL_STEPS=TOTAL_TOKENS//STEP_TOKENS +BUDGET_MIN=float(sys.argv[1]) if len(sys.argv)>1 else 1380 # 23 saat varsayilan +PROBE_EVERY=2000; SAVE_EVERY=500 +if BUDGET_MIN<20: PROBE_EVERY=40; SAVE_EVERY=60 # duman: tum gecis yollarini dene +os.makedirs(OUT, exist_ok=True) + +tok=AutoTokenizer.from_pretrained(MID) +model=AutoModelForCausalLM.from_pretrained(MID, torch_dtype=torch.bfloat16) +model.gradient_checkpointing_enable(gradient_checkpointing_kwargs={"use_reentrant":False}) +model.enable_input_require_grads() +for p in model.parameters(): p.requires_grad=False + +class LoRA(nn.Module): + def __init__(self, base, r=R, alpha=ALPHA): + super().__init__(); self.base=base + self.A=nn.Parameter(torch.zeros(r, base.in_features, dtype=torch.bfloat16)) + self.B=nn.Parameter(torch.zeros(base.out_features, r, dtype=torch.bfloat16)) + nn.init.kaiming_uniform_(self.A, a=math.sqrt(5)); self.s=alpha/r + def forward(self,x): + return self.base(x)+((x@self.A.t())@self.B.t())*self.s + +for layer in model.model.layers: + for mod,names in ((layer.self_attn,["q_proj","k_proj","v_proj","o_proj"]), + (layer.mlp,["gate_proj","up_proj","down_proj"])): + for nm in names: setattr(mod,nm,LoRA(getattr(mod,nm))) + +# --- durum: LoRA-only checkpoint (taban donuk; FSDP state-dict labirenti YOK) --- +state={"step":0,"tokens":0,"best_dev":0.0} +sf=f"{OUT}/state.json"; LCK=f"{OUT}/lora_ck.pt" +RESUME_AT=0 +if os.path.exists(sf) and os.path.exists(LCK): + state=json.load(open(sf)); RESUME_AT=state["step"] + lsd=torch.load(LCK, map_location="cpu", weights_only=True) # saf tensor sozlugu + named=dict(model.named_parameters()) + n=0 + for k,v in lsd.items(): + if k in named: + with torch.no_grad(): named[k].copy_(v) + n+=1 + if rank==0: print(f"DEVAM: adim {state['step']} ({state['tokens']/1e9:.2f}B token) — {n} LoRA tensoru yuklendi", flush=True) + +policy=functools.partial(transformer_auto_wrap_policy, transformer_layer_cls={Qwen3DecoderLayer}) +model=FSDP(model, auto_wrap_policy=policy, device_id=local, + mixed_precision=MixedPrecision(param_dtype=torch.bfloat16, reduce_dtype=torch.bfloat16), + use_orig_params=True) +params=[p for p in model.parameters() if p.requires_grad] +opt=torch.optim.AdamW(params, lr=LR, betas=(0.9,0.95), weight_decay=0.01) + +from torch.distributed.fsdp import FullStateDictConfig +_fcfg=FullStateDictConfig(offload_to_cpu=True, rank0_only=True) +def save_ck(): + with FSDP.state_dict_type(model, StateDictType.FULL_STATE_DICT, _fcfg): + sd=model.state_dict() + if rank==0: + lora={k:v for k,v in sd.items() if k.endswith(".A") or k.endswith(".B")} + torch.save(lora, LCK+".tmp") + # Uzerine yazmadan ONCE bir oncekini sakla. Tek dosyaya yazmak, kotu + # giden bir kosuda geri donulecek nokta birakmiyor (olculdu: LR sonum + # kosusu adim 30.000 checkpoint'ini yok etti, geri donus imkansizlasti). + if os.path.exists(LCK): + os.replace(LCK, LCK+".onceki") + if os.path.exists(sf): os.replace(sf, sf+".onceki") + os.replace(LCK+".tmp", LCK) + json.dump(state, open(sf,"w")) + del sd; dist.barrier() + +# SONUM KIPI: ANNEAL_STEPS>0 ise program burada bitirilir; LR, devam +# noktasindaki degerinden ANNEAL_STEPS adimda kosinusle SIFIRA iner. +# Gerekce: uzun program doyuma ulasti (adim 23.500/27.297/30.000 olcumleri +# istatistiksel olarak ayni), ancak LR hic sonumlenmedi. Sonum kazanci +# ucuza sinanir; getirmezse adim 30.000 checkpoint'i kullanilir. +ANNEAL=int(os.environ.get("ANNEAL_STEPS","0")) +def _kosinus(s): + pr=min(1.0,(s-WARMUP)/max(TOTAL_STEPS-WARMUP,1)) + return LR*(0.1+0.45*(1+math.cos(math.pi*pr))) +LR0_ANNEAL=_kosinus(RESUME_AT) if ANNEAL else 0.0 +if ANNEAL: TOTAL_STEPS=RESUME_AT+ANNEAL + +def lr_at(s): + if ANNEAL: + pr=min(1.0,(s-RESUME_AT)/max(ANNEAL,1)) + return LR0_ANNEAL*0.5*(1+math.cos(math.pi*pr)) + if s0 and s-RESUME_AT<50: # parca gecisi: momentler sifir, kisa rampa + base*=max(0.1,(s-RESUME_AT+1)/50) + return base + +# --- veri: hazir token onbellegi (pretokenize.py uretir; is icinde tokenizasyon YOK) --- +CACHE=f"{OUT}/tokens.pt" +assert os.path.exists(CACHE), "tokens.pt yok - once pretokenize.py kos" +ids_all=torch.load(CACHE, map_location="cpu") +N=len(ids_all) +if rank==0: print(f"korpus: {N/1e9:.2f}B token | hedef {TOTAL_TOKENS/1e9:.1f}B ({TOTAL_STEPS} adim) | bu parca {BUDGET_MIN:.0f} dk", flush=True) + +# --- probe: TurkishMMLU test'ten SABIT 150 soru (faz14 formulu) --- +# Final rapor BU SORULAR HARIC held-out 750 uzerinde verilir (secim sizintisi yok). +# FSDP notu: her forward kolektiftir -> TUM ranklar AYNI sorulari ayni sirayla isler +# (rank-bazli bolme farkli forward sayisi yaratir ve NCCL kilitlenmesine yol acar). +from datasets import load_dataset +_full=load_dataset("AYueksel/TurkishMMLU","All",split="test") +_pidx=list(range(1,len(_full),6))[:150] +dev=_full.select(_pidx) +letters="ABCDE"; lid=[tok(" "+c, add_special_tokens=False).input_ids[-1] for c in letters] +def dev_probe(): + model.eval(); cor=0; tot=0 + with torch.no_grad(): + for i in range(len(dev)): + ex=dev[i] + a=ex["answer"]; ans=int(a) if isinstance(a,int) else (letters.index(str(a).strip()) if str(a).strip() in letters else int(a)) + ch=list(ex["choices"]); s="Asagidaki coktan secmeli soruyu cevapla.\n\nSoru: "+str(ex["question"])+"\n" + for j,c in enumerate(ch[:5]): s+=f"{letters[j]}) {c}\n" + ids=tok(s+"Cevap:", return_tensors="pt", truncation=True, max_length=1024).input_ids.to(local) + lg=model(ids).logits[0,-1] + cor+=int(int(torch.stack([lg[t] for t in lid]).argmax())==ans); tot+=1 + model.train() + return 100*cor/max(tot,1) + +t_start=time.time(); t_last=t_start; run=0.0; nacc=0 +model.train() +# NOT: adim-0 probe bilerek YOK — FSDP yurutme-sirasi ilk forward'da kurulur; ilk forward +# eval olursa egitime geciste kilitlenir (olculdu). Stok dev-150 referansi: %68.7 (is 511041). +while state["step"]state["best_dev"]: state["best_dev"]=p + # SURE KONTROLU KOLEKTIF: yerel saat farklari rank'lari farkli adimda durdurup + # NCCL kilidine yol acar (olculdu, is 511050) — karar all-reduce ile ortaklanir. + _stop=torch.tensor([1.0 if (time.time()-t_start)/60>BUDGET_MIN else 0.0], device=local) + dist.all_reduce(_stop, op=dist.ReduceOp.MAX) + if _stop.item()>0: + if rank==0: print(f"SURE DOLDU ({BUDGET_MIN:.0f}dk) — checkpoint alinip cikiliyor", flush=True) + break +save_ck() +if rank==0: print(f"PARCA BITTI: adim {state['step']}/{TOTAL_STEPS} ({state['tokens']/1e9:.2f}B token)", flush=True) +dist.destroy_process_group() diff --git a/betikler/ek_sft_sinav.py b/betikler/ek_sft_sinav.py new file mode 100644 index 0000000000000000000000000000000000000000..5c7ff463afe44adec8bd55a402c4e10ec211f909 --- /dev/null +++ b/betikler/ek_sft_sinav.py @@ -0,0 +1,144 @@ +"""Ek SFT turunun sinavi: kimlik + hata bulma + gerileme kontrolu. + +UC SORU +1) KIMLIK: model kendini dogru tanitiyor mu? Onceden tabanin sahibini + ("Tongyi/Alibaba") soyluyordu. +2) HATA BULMA: serbest metinde morfolojik hatayi bulabiliyor mu? + Nitel denemede "Kitapı masaya koydum" cumlesini DOGRU bulmustu. + SINAV GOVDELERI EGITIMDE HIC KULLANILMADI — egitim verisi uretilirken + kiyasin 29 govdesi bilincli olarak disarida birakilmisti. Temiz sinav. +3) GERILEME: iki dar gorev ogretirken genel yetenek bozuldu mu? + (kiyas puani ayri betikte olculur) + +Karsilastirma: ek tur ONCESI (erk32b-sft) ve SONRASI (erk32b-sft2). +""" +import os, sys, json, re, gc, torch, torch.nn as nn +os.environ["HF_DATASETS_OFFLINE"] = "1" +from transformers import AutoModelForCausalLM, AutoTokenizer + +MID = "/ari/users/ytanis/qwen3-32b" +ONCE = "/ari/users/ytanis/erk32b-sft" +SONRA = "/ari/users/ytanis/erk32b-sft2" +OUT = "/ari/users/ytanis/ek_sft_sinav.json" +R, ALPHA, OLCEK = 256, 512, 0.40 + +# --- KIMLIK sinavi +KIMLIK = [ + ("Seni kim geliştirdi?", ["eCloud"], ["Tongyi", "Alibaba", "OpenAI"]), + ("Kimsin?", ["Erk"], ["Tongyi", "Alibaba"]), + ("Sen Qwen misin?", ["eCloud", "Erk"], []), + ("Temel modelin ne?", ["Qwen"], []), # tabani SOYLEMELI + ("Hangi şirket seni yaptı?", ["eCloud"], ["Tongyi", "Alibaba"]), +] + +# --- HATA BULMA sinavi: govdeler egitimde YOK (kiyasin yasakli listesi) +# (cumle, hatali_mi, dogru_bicim) +HATA = [ + ("Kitapı masaya koydum.", True, "kitabı"), + ("Kitabı masaya koydum.", False, None), + ("Ağaça baktım.", True, "ağaca"), + ("Ağaca baktım.", False, None), + ("Çocukun oyuncağı kayboldu.", True, "çocuğun"), + ("Çocuğun oyuncağı kayboldu.", False, None), + ("Ekmekler taze.", False, None), + ("Ekmeklar taze.", True, "ekmekler"), + ("Okulda kimse yoktu.", False, None), + ("Okulta kimse yoktu.", True, "okulda"), + ("Gözlar yorgun.", True, "gözler"), + ("Gözler yorgun.", False, None), +] + +tok = AutoTokenizer.from_pretrained(MID) +model = AutoModelForCausalLM.from_pretrained(MID, torch_dtype=torch.bfloat16, + device_map="auto").eval() + + +class LoRA(nn.Module): + OLCEK = OLCEK + def __init__(self, base): + super().__init__(); self.base = base + d = base.weight.device + self.A = nn.Parameter(torch.zeros(R, base.in_features, device=d, dtype=torch.bfloat16)) + self.B = nn.Parameter(torch.zeros(base.out_features, R, device=d, dtype=torch.bfloat16)) + self.s = ALPHA / R + def forward(self, x): + if LoRA.OLCEK == 0.0: + return self.base(x) + return self.base(x) + ((x @ self.A.t()) @ self.B.t()) * (self.s * LoRA.OLCEK) + + +for layer in model.model.layers: + for mod, adlar in ((layer.self_attn, ["q_proj", "k_proj", "v_proj", "o_proj"]), + (layer.mlp, ["gate_proj", "up_proj", "down_proj"])): + for nm in adlar: setattr(mod, nm, LoRA(getattr(mod, nm))) +named = dict(model.named_parameters()) + + +def yukle(dizin): + lsd = torch.load("%s/lora_ck.pt" % dizin, map_location="cpu", weights_only=True) + for k, v in lsd.items(): + if k in named: + with torch.no_grad(): named[k].copy_(v.to(named[k].device)) + del lsd; gc.collect(); model.eval() + return json.load(open("%s/state.json" % dizin))["step"] + + +def sor(istem, maks=400): + p = "<|im_start|>user\n%s /no_think<|im_end|>\n<|im_start|>assistant\n" % istem + ids = tok(p, return_tensors="pt", add_special_tokens=False).to(model.device) + with torch.no_grad(): + o = model.generate(**ids, max_new_tokens=maks, do_sample=False, + pad_token_id=tok.eos_token_id) + r = tok.decode(o[0][ids.input_ids.shape[1]:], skip_special_tokens=True) + return r.split("", 1)[1].strip() if "" in r else r.strip() + + +def sinav(etiket): + print("\n" + "=" * 66, flush=True) + print(" %s" % etiket, flush=True) + print("=" * 66, flush=True) + + # 1) kimlik + k_dogru = 0 + print("\n-- KIMLIK", flush=True) + for soru, olmali, olmamali in KIMLIK: + c = sor(soru, 250) + iyi = (any(x.lower() in c.lower() for x in olmali) and + not any(x.lower() in c.lower() for x in olmamali)) + k_dogru += iyi + print(" %s %-28s %s" % ("✓" if iyi else "✗", soru, c[:80].replace("\n", " ")), flush=True) + + # 2) hata bulma + h_dogru = 0 + print("\n-- HATA BULMA (govdeler egitimde YOK)", flush=True) + for cumle, hatali_mi, dogru in HATA: + c = sor('Şu cümlede yazım hatası var mı? Varsa düzelt:\n\n%s' % cumle, 300) + cl = c.lower() + hata_dedi = bool(re.search(r"hata var|yanlış|düzelt|olmalı|doğrusu", cl)) and \ + not re.search(r"hata yok|doğru yazılmış|hata bulunmuyor", cl) + if hatali_mi: + iyi = hata_dedi and (dogru.lower() in cl) + else: + iyi = not hata_dedi + h_dogru += iyi + print(" %s %-32s -> %s" % ("✓" if iyi else "✗", cumle, c[:70].replace("\n", " ")), flush=True) + + print("\n KIMLIK %d/%d" % (k_dogru, len(KIMLIK)), flush=True) + print(" HATA BULMA %d/%d" % (h_dogru, len(HATA)), flush=True) + return {"kimlik": k_dogru, "kimlik_n": len(KIMLIK), + "hata": h_dogru, "hata_n": len(HATA)} + + +son = {} +a = yukle(ONCE); son["once"] = sinav("EK TUR ONCESI (adim %d)" % a) +b = yukle(SONRA); son["sonra"] = sinav("EK TUR SONRASI (adim %d)" % b) + +print("\n" + "=" * 66, flush=True) +print(" ONCE kimlik %d/%d · hata bulma %d/%d" + % (son["once"]["kimlik"], son["once"]["kimlik_n"], + son["once"]["hata"], son["once"]["hata_n"]), flush=True) +print(" SONRA kimlik %d/%d · hata bulma %d/%d" + % (son["sonra"]["kimlik"], son["sonra"]["kimlik_n"], + son["sonra"]["hata"], son["sonra"]["hata_n"]), flush=True) +json.dump(son, open(OUT, "w"), ensure_ascii=False) +print("BITTI", flush=True) diff --git a/betikler/eval32b_heldout.py b/betikler/eval32b_heldout.py new file mode 100644 index 0000000000000000000000000000000000000000..5862d25b607648206d7cc70b13ef861ad76591f7 --- /dev/null +++ b/betikler/eval32b_heldout.py @@ -0,0 +1,91 @@ +"""Erk-32B ara degerlendirme — HELD-OUT 750 (probe'un 150 sorusu HARIC). +Mevcut LoRA checkpoint'i taban modele takip gercek sayiyi olcer.""" +import os, json, math, torch, torch.nn as nn +os.environ["HF_DATASETS_OFFLINE"]="1" +from transformers import AutoModelForCausalLM, AutoTokenizer +from datasets import load_dataset + +MID="/ari/users/ytanis/qwen3-32b" +# Olculecek checkpoint dizini disaridan verilebilir (CPT / SFT ayni betikle +# ayni protokolde olculsun diye). +OUT=os.environ.get("CK_DIR", "/ari/users/ytanis/erk32b-cpt") +R=256; ALPHA=512 +tok=AutoTokenizer.from_pretrained(MID) +model=AutoModelForCausalLM.from_pretrained(MID, torch_dtype=torch.bfloat16, device_map="auto").eval() + +class LoRA(nn.Module): + def __init__(self, base, r=R, alpha=ALPHA): + super().__init__(); self.base=base + d=base.weight.device + self.A=nn.Parameter(torch.zeros(r, base.in_features, device=d, dtype=torch.bfloat16)) + self.B=nn.Parameter(torch.zeros(base.out_features, r, device=d, dtype=torch.bfloat16)) + self.s=alpha/r + def forward(self,x): + return self.base(x)+((x@self.A.t())@self.B.t())*self.s +for layer in model.model.layers: + for mod,names in ((layer.self_attn,["q_proj","k_proj","v_proj","o_proj"]), + (layer.mlp,["gate_proj","up_proj","down_proj"])): + for nm in names: setattr(mod,nm,LoRA(getattr(mod,nm))) + +st=json.load(open(f"{OUT}/state.json")) +lsd=torch.load(f"{OUT}/lora_ck.pt", map_location="cpu", weights_only=True) +named=dict(model.named_parameters()); n=0 +for k,v in lsd.items(): + if k in named: + with torch.no_grad(): named[k].copy_(v.to(named[k].device)) + n+=1 +print(f"LoRA yuklendi: {n} tensor | adim {st['step']} ({st['tokens']/1e9:.2f}B token)", flush=True) + +ds=load_dataset("AYueksel/TurkishMMLU","All",split="test") +letters="ABCDE"; lid=[tok(" "+c, add_special_tokens=False).input_ids[-1] for c in letters] +probe=set(list(range(1,len(ds),6))[:150]) +held=[i for i in range(min(900,len(ds))) if i not in probe] +# --- Olcum protokolu (adim 23500'de sabitlendi, olculdu): +# 1) probe'un 150 sorusu haric -> secim sizintisi yok +# 2) kirli sorular haric -> kulliyatta 13-kelime birebir gecenler +# (held-out 750'nin 98'i; bkz. kirlilik_CPT.json) +# 3) sik sirasi dondurulur -> harf/konum onyargisi elenir +# Bu ucu birden uygulanmadan olculen fark ~2 puan sisiyor (6.27 -> 4.14). +KIR=set() +try: + KIR=set(json.load(open("/ari/users/ytanis/kirlilik_CPT.json"))["kirli_13"]) +except Exception as e: + print("UYARI: kirlilik listesi okunamadi (%s) — temiz alt kume raporlanmayacak" % e, flush=True) +temiz=[i for i in held if i not in KIR] + +def run(kaydir): + v=[] + with torch.no_grad(): + for i in held: + ex=ds[i] + try: + a=ex["answer"]; ans=int(a) if isinstance(a,int) else letters.index(str(a).strip()) + except: v.append(None); continue + ch=list(ex["choices"])[:5]; k=len(ch) + if kaydir: + ch=ch[-kaydir:]+ch[:-kaydir]; ans=(ans+kaydir)%k + s="Asagidaki coktan secmeli soruyu cevapla.\n\nSoru: "+str(ex["question"])+"\n" + for j,c in enumerate(ch): s+=f"{letters[j]}) {c}\n" + ids=tok(s+"Cevap:", return_tensors="pt", truncation=True, max_length=1024).input_ids.to(model.device) + lg=model(ids).logits[0,-1] + v.append(int(int(torch.stack([lg[t] for t in lid[:k]]).argmax())==ans)) + return v + +def oran(v, idx): + z=[v[held.index(i)] for i in idx if v[held.index(i)] is not None] + return 100*sum(z)/max(len(z),1), len(z) + +sonuc={"step":st["step"],"tokens":st["tokens"]} +# Asama etiketi checkpoint dizininden turetilir; sabit "CPT" yazmak SFT +# olcumlerinde yaniltici log uretiyordu. +ASAMA = "SFT" if OUT.rstrip("/").endswith("sft") else "CPT" +print(f"\n=== ERK-32B ({ASAMA}, adim {st['step']}, {st['tokens']/1e9:.2f}B token) ===", flush=True) +for ad,kay in (("orijinal",0),("dondurulmus",1)): + v=run(kay); sonuc["vec_"+ad]=v + a750,n750=oran(v,held); atem,ntem=oran(v,temiz) + sonuc[ad]={"held750":a750,"temiz":atem,"n_temiz":ntem} + print(f" {ad:12s} held-out {n750}: %{a750:.2f} | TEMIZ {ntem}: %{atem:.2f}", flush=True) +print(f"\nRAPORLANACAK SAYI (temiz + dondurulmus): %{sonuc['dondurulmus']['temiz']:.2f}", flush=True) +print(f" stok Qwen3-32B ayni kosulda: %67.64 (adim 23500 olcumunden)", flush=True) +json.dump(sonuc, open(f"{OUT}/heldout_step{st['step']}.json","w")) +print("BITTI", flush=True) diff --git a/betikler/gguf_uret.py b/betikler/gguf_uret.py new file mode 100644 index 0000000000000000000000000000000000000000..84eaae7f334feeae91189a32afc74be8a3bf79e8 --- /dev/null +++ b/betikler/gguf_uret.py @@ -0,0 +1,104 @@ +"""Birlesik Erk-32B -> GGUF (BF16) -> Q8_0 ve Q4_K_M, ardindan dogrulama. + +NEDEN DERLEME YOK: kume gcc 8.5 ile llama.cpp'yi baglayamadi, toolset-12 dizini +bos. Donusum saf Python (gguf-py), nicemleme hazir CPU tekerlegindeki +llama_cpp.llama_model_quantize ile yapiliyor. Surumler sabit: llama.cpp git +, llama-cpp-python 0.3.35. + +DOGRULAMA — nicemleme yayinlanan modeli degistirir, o yuzden her nicem icin: + 1) kimlik: 6 soru, sistem istemiyle (sablon icinde varsayilan) — 6/6 beklenir + 2) NLL: Turkce metin parcalarinda ortalama negatif log-olasilik, BF16'ya gore + artis yuzdesi. Q8_0 icin ~%0-1, Q4_K_M icin birkac yuzde beklenir; buyuk + sapma nicemlemenin bozuk oldugunu gosterir ve yayinlanmaz. +Kiyas puani (TurkishMMLU) GGUF uzerinde OLCULMEZ — 32B'yi CPU'da 652 soru +kosturmak saatler surer; NLL ve kimlik ile yetinilir ve bu raporda yazilir. +""" +import os, sys, json, time, subprocess, math + +KOK = "/ari/users/ytanis" +BIRLESIK = os.environ.get("BIRLESIK", KOK + "/erk32b-birlesik-080") +CIKTI = os.environ.get("GGUF_DIR", KOK + "/erk32b-gguf") +AD = os.environ.get("GGUF_AD", "Erk-32B") +PY_TORCH = KOK + "/envs/torch/bin/python" +PY_GGUF = KOK + "/envs/gguf/bin/python" +DONUSTUR = KOK + "/llama.cpp/convert_hf_to_gguf.py" +NLL_METIN = os.environ.get("NLL_METIN", KOK + "/erk/nll_ornek.txt") # 8 x ~400 kelime Turkce +os.makedirs(CIKTI, exist_ok=True) +bf16 = "%s/%s-BF16.gguf" % (CIKTI, AD) +q8 = "%s/%s-Q8_0.gguf" % (CIKTI, AD) +q4 = "%s/%s-Q4_K_M.gguf" % (CIKTI, AD) +t0 = time.time() + + +def adim(ad): + print("\n=== %s | %.0f dk ===" % (ad, (time.time() - t0) / 60), flush=True) + + +# 1) donusum (torch ortami: gguf-py + transformers) +if not os.path.exists(bf16): + adim("BF16 GGUF donusumu") + subprocess.run([PY_TORCH, DONUSTUR, BIRLESIK, "--outfile", bf16, "--outtype", "bf16"], check=True) +print("BF16: %.1f GB" % (os.path.getsize(bf16) / 1e9), flush=True) + +# 2) nicemleme (gguf ortami: hazir tekerlek) +NICEM = r''' +import sys, llama_cpp +src, dst, tur = sys.argv[1], sys.argv[2], sys.argv[3] +p = llama_cpp.llama_model_quantize_default_params() +p.ftype = getattr(llama_cpp, "LLAMA_FTYPE_MOSTLY_" + tur) +p.nthread = 16 +r = llama_cpp.llama_model_quantize(src.encode(), dst.encode(), p) +print("quantize", tur, "donus kodu", r); sys.exit(r) +''' +for dst, tur in ((q8, "Q8_0"), (q4, "Q4_K_M")): + if not os.path.exists(dst): + adim("nicemleme " + tur) + subprocess.run([PY_GGUF, "-c", NICEM, bf16, dst, tur], check=True) + print("%s: %.1f GB" % (tur, os.path.getsize(dst) / 1e9), flush=True) + +# 3) dogrulama +DOGRULA = r''' +import sys, json, math, llama_cpp +from llama_cpp import Llama +yol, metin_yolu = sys.argv[1], sys.argv[2] +llm = Llama(model_path=yol, n_ctx=1024, n_threads=16, logits_all=True, verbose=False) +# kimlik: sablon icindeki varsayilan sistem istemi devreye girmeli +sorular = ["Seni kim geliştirdi?", "Kimsin?", "Sen Qwen misin?", "Temel modelin ne?", + "Hangi şirket seni yaptı?", "Sen ChatGPT misin?"] +kimlik = 0; cevaplar = [] +for s in sorular: + r = llm.create_chat_completion(messages=[{"role": "user", "content": s + " /no_think"}], + max_tokens=120, temperature=0) + c = r["choices"][0]["message"]["content"].split("")[-1].strip() + cl = c.lower() + iyi = ("erk" in cl or "ecloud" in cl) and not any(x in cl for x in ("alibaba", "tongyi", "openai", "chatgpt")) + if s == "Temel modelin ne?": iyi = "qwen" in cl + kimlik += iyi; cevaplar.append((s, iyi, c[:80])) +# NLL: metin parcalari +parcalar = [p.strip() for p in open(metin_yolu, encoding="utf-8").read().split("\n\n") if len(p.split()) > 50][:8] +top_nll = 0.0; top_n = 0 +for p in parcalar: + ids = llm.tokenize(p.encode("utf-8"))[:768] + llm.reset(); llm.eval(ids) + import numpy as np + lg = np.asarray(llm.scores[:len(ids)], dtype=np.float32) # [n, vocab] + for i in range(len(ids) - 1): + row = lg[i]; m = row.max(); lse = m + math.log(np.exp(row - m).sum()) + top_nll += lse - row[ids[i + 1]]; top_n += 1 +json.dump({"kimlik": kimlik, "n_kimlik": len(sorular), "cevaplar": cevaplar, + "nll": top_nll / max(top_n, 1), "token": top_n}, open(yol + ".dogrulama.json", "w"), ensure_ascii=False, indent=1) +print("%s | kimlik %d/%d | NLL %.4f (%d token)" % (yol.split("/")[-1], kimlik, len(sorular), top_nll / max(top_n, 1), top_n)) +''' +son = {} +for yol in (bf16, q8, q4): + adim("dogrulama " + os.path.basename(yol)) + subprocess.run([PY_GGUF, "-c", DOGRULA, yol, NLL_METIN], check=True) + son[os.path.basename(yol)] = json.load(open(yol + ".dogrulama.json")) + +adim("OZET") +taban = son[os.path.basename(bf16)]["nll"] +for k, v in son.items(): + print(" %-26s kimlik %d/%d NLL %.4f (BF16'ya gore %+.2f%%)" + % (k, v["kimlik"], v["n_kimlik"], v["nll"], 100 * (v["nll"] - taban) / taban), flush=True) +json.dump(son, open(CIKTI + "/dogrulama_ozet.json", "w"), ensure_ascii=False, indent=1) +print("BITTI", flush=True) diff --git a/betikler/hata_duzeltme_uret.py b/betikler/hata_duzeltme_uret.py new file mode 100644 index 0000000000000000000000000000000000000000..47b7faa5a475591b28480d3711898a61222dcfde --- /dev/null +++ b/betikler/hata_duzeltme_uret.py @@ -0,0 +1,175 @@ +"""Turkce morfolojik hata-duzeltme egitim verisi ureteci (v2). + +NEDEN: Erk-32B "Kitapı masaya koydum" cumlesini DOGRU buldu (dogrusu +"Kitabı"). Aday cekimler arasindan dogrusunu secebiliyor ama serbest +metinde hatayi bulamiyor; kulliyatta bu bicimde ornek yok. + +v1'DE BULUNAN VE DUZELTILEN IKI KUSUR +1) Unsuz yumusamasini TUM p/t/k/c sonlarina uyguluyordum: "sepeti" yerine + "sepedi" uretti. Yumusama SOZLUKSELDIR — kitap→kitabı yumusar, + sepet→sepeti yumusamaz; bardak→bardağı yumusar, at→atı yumusamaz. + Bu veriyle egitmek modele YANLIS Turkce ogretirdi. + Cozum: yumusama yalnizca DOGRULANMIS listedeki govdelere uygulanir. +2) Cekim ile cumle kalibi uyusmuyordu: cogul bicimi belirtme hali isteyen + kaliba konunca "Koltuklar elime aldım" gibi bozuk cumle cikti. + Cozum: her hal kendi kalibiyla eslenir. + +KIRLILIK: kiyasin 29 govdesi egitimde kullanilmaz. +DENGE : orneklerin yarisi DOGRU cumledir (yoksa model her cumlede hata uydurur). +""" +import json, os, random, sys + +random.seed(20260901) +CIKTI = os.environ.get("CIKTI", "/ari/users/ytanis/erk/hata_duzeltme.jsonl") +N = int(sys.argv[1]) if len(sys.argv) > 1 else 40000 + +ARKA = "aıou"; UNLU = "aıoueiöü"; SERT = "fstkçşhp" + +YASAK = {"kitap", "ev", "göz", "araba", "çocuk", "ağaç", "renk", "köpek", "yol", + "masa", "deniz", "kuş", "çiçek", "bulut", "dağ", "orman", "sabun", + "okul", "balık", "kapı", "elma", "süt", "kum", "taş", "duvar", + "ekmek", "pencere", "yaprak", "ateş"} + +# --- YUMUSAYAN govdeler (elle dogrulanmis): ünlüyle baslayan ek alinca +# son unsuz degisir. bardak→bardağı, dolap→dolabı, kanat→kanadı +YUMUSAYAN = { + "bardak": "bardağ", "tabak": "tabağ", "bıçak": "bıçağ", "kaşık": "kaşığ", + "koltuk": "koltuğ", "dolap": "dolab", "kapak": "kapağ", "sepet": None, + "yatak": "yatağ", "durak": "durağ", "sokak": "sokağ", "ayak": "ayağ", + "kulak": "kulağ", "toprak": "toprağ", "yaprak": None, "kağıt": "kağıd", + "kanat": "kanad", "damak": "damağ", "börek": "böreğ", "çiçek": None, + "gömlek": "gömleğ", "etek": "eteğ", "kürek": "küreğ", "direk": "direğ", + "bebek": "bebeğ", "köşk": None, "amaç": "amac", "ilaç": "ilac", + "sanat": None, "kitap": None, "hesap": "hesab", "cevap": "cevab", + "kitaplık": "kitaplığ", "yemek": "yemeğ", "çocuk": None, "uçak": "uçağ", + "bıçaklık": None, "sandık": "sandığ", "tarak": "tarağ", "kayık": "kayığ", +} +YUMUSAYAN = {k: v for k, v in YUMUSAYAN.items() if v and k not in YASAK} + +# --- YUMUSAMAYAN govdeler (elle dogrulanmis): p/t/k/c ile bitse de degismez +YUMUSAMAZ = ["sepet", "devlet", "millet", "sanat", "kat", "at", "top", "saç", + "genç", "surat", "hayat", "market", "internet", "paket", "bilet", + "tabiat", "işaret", "kuvvet", "cesaret", "sepetçik"] +YUMUSAMAZ = [w for w in YUMUSAMAZ if w not in YASAK] + +# --- UNLUYLE ya da yumusak unsuzle biten duz govdeler: yalnizca uyum kurallari +DUZ = """kalem defter sandalye perde halı lamba ayna kutu çanta cüzdan +anahtar kilit şişe kavanoz tencere tava havlu pantolon ceket palto şapka +eldiven çorap kamyon otobüs tren gemi bisiklet motor tekerlek cadde meydan +köprü tünel istasyon liman hastane eczane manav lokanta otel müze +öğretmen öğrenci doktor hemşire mühendis avukat memur işçi çiftçi +kedi kuzu tavuk horoz inek koyun keçi eşek deve tilki kurt ayı +armut kiraz vişne şeftali kayısı erik üzüm incir nar portakal limon +domates biber patlıcan salatalık havuç patates soğan sarımsak marul +bulgur pirinç mercimek nohut fasulye makarna çorba salata +bahçe balkon teras merdiven asansör koridor salon mutfak banyo +beyin böbrek mide damar sinir kemik deri kalem silgi cetvel makas zarf +bilgisayar telefon tablet ekran klavye fare yazıcı kablo +rüzgar yağmur kar şimşek göl ırmak dere pınar""".split() +DUZ = [g for g in dict.fromkeys(DUZ) if g not in YASAK] + + +def son_unlu(w): + for c in reversed(w.lower()): + if c in UNLU: + return c + return "a" + + +def A(w): return "a" if son_unlu(w) in ARKA else "e" +def I(w): + v = son_unlu(w) + return {"a": "ı", "ı": "ı", "o": "u", "u": "u", + "e": "i", "i": "i", "ö": "ü", "ü": "ü"}[v] +def D(w): return "t" if w[-1] in SERT else "d" +def unlulu(w): return w[-1] in UNLU + + +TERS_I = {"ı": "i", "i": "ı", "u": "ü", "ü": "u"} + + +def uret(w, govde_yumusak=None): + """(hal, dogru, hatali, kural, aciklama) listesi. + + Yumusama YALNIZCA govde_yumusak verilmisse uretilir; verilmemisse + o govde icin yumusama ornegi hic uretilmez (yanlis veri riskini + tamamen kaldirir).""" + a, i, d = A(w), I(w), D(w) + ti, ta, td = TERS_I[i], ("e" if a == "a" else "a"), ("d" if d == "t" else "t") + ck = [] + # 1) unlu uyumu — saf fonolojik, her govde icin guvenli + ck.append(("çoğul", w + "l" + a + "r", w + "l" + ta + "r", "ünlü uyumu", + "son ünlü '%s' kalın/ince olduğu için çoğul eki '-l%sr' olur" + % (son_unlu(w), a))) + ck.append(("yönelme", w + ("y" if unlulu(w) else "") + a, + w + ("y" if unlulu(w) else "") + ta, "ünlü uyumu", + "son ünlü '%s' olduğu için yönelme eki '-%s' olur" % (son_unlu(w), a))) + # 2) unsuz benzesmesi — saf fonolojik + ck.append(("bulunma", w + d + a, w + td + a, "ünsüz benzeşmesi", + "%s sert ünsüzle bittiği için ek '-t%s' olur" % (w, a) if d == "t" + else "%s sert ünsüzle bitmediği için ek '-d%s' olur" % (w, a))) + # 3) unsuz yumusamasi — yalnizca dogrulanmis govdelerde + if govde_yumusak: + ck.append(("belirtme", govde_yumusak + i, w + i, "ünsüz yumuşaması", + "'%s' ünlüyle başlayan ek aldığında sondaki '%s' yumuşayıp '%s' olur" + % (w, w[-1], govde_yumusak[-1]))) + return ck + + +# hal -> kalip (hal ile kalip UYUSMALI; v1'de uyusmuyordu) +KALIP = { + "çoğul": ["{} çok güzeldi.", "{} burada duruyor.", "Yeni {} geldi."], + "yönelme": ["Kitabı {} koydum.", "{} doğru yürüdüm.", "{} baktım."], + "bulunma": ["{} bir leke var.", "{} kimse yok.", "{} bekliyorum."], + "belirtme": ["{} elime aldım.", "{} masaya koydum.", "Dün {} gördüm."], +} +SORULAR = ["Şu cümlede yazım hatası var mı? Varsa düzelt ve nedenini açıkla:\n\n%s", + "Bu cümleyi kontrol et:\n\n%s", + "\"%s\" cümlesi doğru mu? Değilse düzelt.", + "Aşağıdaki cümlede dil bilgisi hatası var mı?\n\n%s"] + + +def buyut(s): return s[0].upper() + s[1:] if s else s + + +havuz = ([(w, YUMUSAYAN[w]) for w in YUMUSAYAN] + + [(w, None) for w in YUMUSAMAZ] + [(w, None) for w in DUZ]) + +ornekler = [] +while len(ornekler) < N: + w, yum = random.choice(havuz) + ck = uret(w, yum) + hal, dogru, hatali, kural, aciklama = random.choice(ck) + if dogru == hatali: + continue + hatali_mi = random.random() < 0.5 + kul = hatali if hatali_mi else dogru + c = buyut(random.choice(KALIP[hal]).format(kul)) + soru = random.choice(SORULAR) % c + if hatali_mi: + cevap = ("Evet, bir hata var.\n\n**Yanlış:** %s\n**Doğru:** %s\n\n" + "**Neden:** %s. Türkçede %s." + % (kul, dogru, kural.capitalize(), aciklama)) + else: + cevap = ("Cümlede hata yok, doğru yazılmış.\n\n" + "\"%s\" biçimi doğrudur — %s (%s)." % (dogru, aciklama, kural)) + ornekler.append({"messages": [{"role": "user", "content": soru}, + {"role": "assistant", "content": cevap}]}) + +random.shuffle(ornekler) +with open(CIKTI, "w", encoding="utf-8") as f: + for o in ornekler: + f.write(json.dumps(o, ensure_ascii=False) + "\n") + +h = sum(1 for o in ornekler if "Evet, bir hata var" in o["messages"][1]["content"]) +print("uretilen: %d | hatali %d (%%%.1f) | dogru %d" + % (len(ornekler), h, 100 * h / len(ornekler), len(ornekler) - h)) +print("govde havuzu: %d (yumusayan %d, yumusamayan %d, duz %d) | yasak %d" + % (len(havuz), len(YUMUSAYAN), len(YUMUSAMAZ), len(DUZ), len(YASAK))) +print("-> %s\n" % CIKTI) +for etiket, anahtar in (("HATALI", "Evet"), ("DOGRU", "hata yok")): + for o in ornekler: + if anahtar in o["messages"][1]["content"]: + print("--- %s ---" % etiket) + print(o["messages"][0]["content"]); print(o["messages"][1]["content"]); print() + break diff --git a/betikler/kimlik_sinavi_genis.py b/betikler/kimlik_sinavi_genis.py new file mode 100644 index 0000000000000000000000000000000000000000..2782964559ce66bad7658bf66f61a97dff7e80f7 --- /dev/null +++ b/betikler/kimlik_sinavi_genis.py @@ -0,0 +1,137 @@ +"""Ek tur sonrasi model — GENIS kimlik sinavi, olcek 0,70-1,00. + +NEDEN: ilk kimlik sinavi 5 soruydu. 0,80'de 2/5, 1,0'da 5/5 cikti; bes soruyla +"kismi" ile "tam" arasindaki farki guvenle soylemek mumkun degil. Bu surum +30 soru: ayni bes sorunun soz dizimi/uslup cesitlemeleri, sirket ve urun +sorulari, tuzak sorular ("Alibaba mi yapti?", "Sen ChatGPT misin?"). + +OLCUT: cevapta OLMALI listesinden en az biri gecer VE OLMAMALI listesinden +hicbiri gecmez. "Temel modelin ne?" tipi sorularda Qwen'i SOYLEMESI gerekir — +tabani gizleyen cevap yanlis sayilir; durustluk kimligin parcasi. + +Egitim verisindeki soru metinleri (kimlik_uret.py SORULAR listesi) burada +kismen tekrar ediyor — bu bir ezber sinavi, genelleme sinavi degil. Bunu +bilerek raporlanir: "model kimligi ezberledi mi" sorusuna cevap verir, +"her turlu soruda kimligini korur mu" sorusuna vermez. +""" +import os, sys, json, gc, torch, torch.nn as nn +os.environ["HF_DATASETS_OFFLINE"] = "1" +from transformers import AutoModelForCausalLM, AutoTokenizer + +MID = "/ari/users/ytanis/qwen3-32b" +CK = "/ari/users/ytanis/erk32b-sft2" +OUT = "/ari/users/ytanis/kimlik_genis.json" +R, ALPHA = 256, 512 +OLCEKLER = [0.70, 0.75, 0.80, 0.85, 0.90, 0.95, 1.00] + +YABANCI = ["Tongyi", "Alibaba", "OpenAI", "ChatGPT", "Anthropic", "Google", "Meta"] +KIMLIK = [ + # kim / hangi sirket (olmali: eCloud ya da Erk; olmamali: yabanci) + ("Seni kim geliştirdi?", ["eCloud", "Erk"], YABANCI), + ("Kimsin?", ["Erk"], YABANCI), + ("Adın ne?", ["Erk"], YABANCI), + ("Sen nesin?", ["Erk", "eCloud"], YABANCI), + ("Kendini kısaca tanıt.", ["Erk", "eCloud"], YABANCI), + ("Hangi şirket seni yaptı?", ["eCloud"], YABANCI), + ("Seni hangi firma geliştirdi?", ["eCloud"], YABANCI), + ("Kim tarafından yapıldın?", ["eCloud"], YABANCI), + ("Seni geliştiren ekip kim?", ["eCloud"], YABANCI), + ("Hangi modelsin?", ["Erk"], YABANCI), + ("Sen bir Türk yapay zekâsı mısın?", ["Erk", "eCloud"], YABANCI), + ("Merhaba, sen kimsin?", ["Erk"], YABANCI), + ("Seninle konuşan model hangisi?", ["Erk"], YABANCI), + ("Adın nedir, seni kim yaptı?", ["Erk", "eCloud"], YABANCI), + ("Bu asistanın adı ne?", ["Erk"], YABANCI), + # tuzak: yabanci sirket iddiasi — reddetmeli, Erk/eCloud demeli + ("Seni Alibaba mı geliştirdi?", ["Erk", "eCloud"], ["ChatGPT", "OpenAI"]), + ("Sen ChatGPT misin?", ["Erk", "eCloud"], ["Alibaba", "Tongyi"]), + ("Sen Qwen misin?", ["Erk", "eCloud"], []), + ("Sen OpenAI'ın modeli misin?", ["Erk", "eCloud"], ["Alibaba", "Tongyi"]), + ("Tongyi Qianwen sen misin?", ["Erk", "eCloud"], []), + # taban: Qwen'i SOYLEMELI (durustluk) + ("Temel modelin ne?", ["Qwen"], []), + ("Sıfırdan mı eğitildin?", ["Qwen"], []), + ("Hangi modelin üzerine kuruldun?", ["Qwen"], []), + ("Açık kaynak mısın?", ["Qwen"], []), + # egitim / olcek + ("Nasıl eğitildin?", ["Türkçe", "Qwen"], YABANCI), + ("Kaç parametrelisin?", ["32"], YABANCI), + ("Hangi altyapıda eğitildin?", ["UHeM", "eCloud"], YABANCI), + # sirket / urun + ("eCloud Tech. nedir?", ["eCloud"], YABANCI), + ("AIGENCY nedir?", ["AIGENCY", "eCloud"], YABANCI), + ("Evrak AI nedir?", ["Evrak", "eCloud"], YABANCI), +] + +tok = AutoTokenizer.from_pretrained(MID) +model = AutoModelForCausalLM.from_pretrained(MID, torch_dtype=torch.bfloat16, + device_map="auto").eval() + + +class LoRA(nn.Module): + OLCEK = 0.0 + def __init__(self, base): + super().__init__(); self.base = base + d = base.weight.device + self.A = nn.Parameter(torch.zeros(R, base.in_features, device=d, dtype=torch.bfloat16)) + self.B = nn.Parameter(torch.zeros(base.out_features, R, device=d, dtype=torch.bfloat16)) + self.s = ALPHA / R + def forward(self, x): + if LoRA.OLCEK == 0.0: + return self.base(x) + return self.base(x) + ((x @ self.A.t()) @ self.B.t()) * (self.s * LoRA.OLCEK) + + +for layer in model.model.layers: + for mod, adlar in ((layer.self_attn, ["q_proj", "k_proj", "v_proj", "o_proj"]), + (layer.mlp, ["gate_proj", "up_proj", "down_proj"])): + for nm in adlar: + setattr(mod, nm, LoRA(getattr(mod, nm))) +named = dict(model.named_parameters()) +lsd = torch.load("%s/lora_ck.pt" % CK, map_location="cpu", weights_only=True) +esles = 0 +for k, v in lsd.items(): + if k in named: + with torch.no_grad(): + named[k].copy_(v.to(named[k].device)) + esles += 1 +print("LoRA anahtar eslesme: %d (checkpoint icinde %d)" % (esles, len(lsd)), flush=True) +if esles == 0: + print("HATA: hicbir agirlik yuklenmedi — sinav taban modeli olcerdi, duruyorum", flush=True) + sys.exit(1) +del lsd; gc.collect(); model.eval() + + +def sor(istem, maks=220): + p = "<|im_start|>user\n%s /no_think<|im_end|>\n<|im_start|>assistant\n" % istem + ids = tok(p, return_tensors="pt", add_special_tokens=False).to(model.device) + with torch.no_grad(): + o = model.generate(**ids, max_new_tokens=maks, do_sample=False, + pad_token_id=tok.eos_token_id) + r = tok.decode(o[0][ids.input_ids.shape[1]:], skip_special_tokens=True) + return r.split("", 1)[1].strip() if "" in r else r.strip() + + +son = {} +for ol in OLCEKLER: + LoRA.OLCEK = ol + print("\n" + "=" * 64 + "\n OLCEK %.2f\n" % ol + "=" * 64, flush=True) + dogru = 0; basarisiz = [] + for soru, olmali, olmamali in KIMLIK: + c = sor(soru) + cl = c.lower() + iyi = any(x.lower() in cl for x in olmali) and not any(x.lower() in cl for x in olmamali) + dogru += iyi + if not iyi: + basarisiz.append(soru) + print(" %s %-36s %s" % ("+" if iyi else "-", soru, c[:70].replace("\n", " ")), flush=True) + print("\n KIMLIK %d/%d" % (dogru, len(KIMLIK)), flush=True) + son["%.2f" % ol] = {"dogru": dogru, "n": len(KIMLIK), "basarisiz": basarisiz} + json.dump(son, open(OUT, "w"), ensure_ascii=False, indent=1) + +print("\n" + "=" * 64) +print(" OLCEK KIMLIK") +for ol in OLCEKLER: + d = son["%.2f" % ol] + print(" %.2f %2d/%d" % (ol, d["dogru"], d["n"])) +print("BITTI", flush=True) diff --git a/betikler/kimlik_sistem_istemi.py b/betikler/kimlik_sistem_istemi.py new file mode 100644 index 0000000000000000000000000000000000000000..f0e1126e41e09a48613ea180fa5231e07d20e4ca --- /dev/null +++ b/betikler/kimlik_sistem_istemi.py @@ -0,0 +1,137 @@ +"""Kimlik SISTEM ISTEMIYLE verilirse tutuyor mu? Ayni 30 soru, 0,40 / 0,80 / 1,00. + +NEDEN: agirliklara islenen kimlik ancak olcek 1,0'da oturuyor (28/30), 0,80'de +12/30. Ama en iyi sohbet 0,80'de, en iyi kiyas 0,40'ta. Kimligi cikarim +aninda sistem mesajiyla tasimak, olcek secimini kimlikten bagimsizlastirir. + +Bu durust bir yontem: sistem istemi taban modeli (Qwen3-32B) acikca soyluyor. +Olculen sey "model sistem istemine uyuyor mu" — uymazsa (ornegin tuzak +soruda yine Alibaba derse) bu yol kapali demektir. + +Kimlik olcutu kimlik_sinavi_genis.py ile ayni; oradaki KIMLIK listesi ve +puanlama import edilmeden kopyalandi ki bu dosya tek basina calissin. +""" +import os, sys, json, gc, torch, torch.nn as nn +os.environ["HF_DATASETS_OFFLINE"] = "1" +from transformers import AutoModelForCausalLM, AutoTokenizer + +# kimlik_sinavi_genis.py'den IMPORT EDILMIYOR: o dosya modul duzeyinde modeli +# yukleyip taramayi calistiriyor; import etmek tum taramayi yeniden kosturur. +# Liste ve LoRA sinifi buraya kopyalandi. Iki dosya ayni 30 soruyu kullanmali — +# degisiklik yapilirsa ikisinde birden yapilmali. +R, ALPHA = 256, 512 +YABANCI = ["Tongyi", "Alibaba", "OpenAI", "ChatGPT", "Anthropic", "Google", "Meta"] +KIMLIK = [ + ("Seni kim geliştirdi?", ["eCloud", "Erk"], YABANCI), + ("Kimsin?", ["Erk"], YABANCI), + ("Adın ne?", ["Erk"], YABANCI), + ("Sen nesin?", ["Erk", "eCloud"], YABANCI), + ("Kendini kısaca tanıt.", ["Erk", "eCloud"], YABANCI), + ("Hangi şirket seni yaptı?", ["eCloud"], YABANCI), + ("Seni hangi firma geliştirdi?", ["eCloud"], YABANCI), + ("Kim tarafından yapıldın?", ["eCloud"], YABANCI), + ("Seni geliştiren ekip kim?", ["eCloud"], YABANCI), + ("Hangi modelsin?", ["Erk"], YABANCI), + ("Sen bir Türk yapay zekâsı mısın?", ["Erk", "eCloud"], YABANCI), + ("Merhaba, sen kimsin?", ["Erk"], YABANCI), + ("Seninle konuşan model hangisi?", ["Erk"], YABANCI), + ("Adın nedir, seni kim yaptı?", ["Erk", "eCloud"], YABANCI), + ("Bu asistanın adı ne?", ["Erk"], YABANCI), + ("Seni Alibaba mı geliştirdi?", ["Erk", "eCloud"], ["ChatGPT", "OpenAI"]), + ("Sen ChatGPT misin?", ["Erk", "eCloud"], ["Alibaba", "Tongyi"]), + ("Sen Qwen misin?", ["Erk", "eCloud"], []), + ("Sen OpenAI'ın modeli misin?", ["Erk", "eCloud"], ["Alibaba", "Tongyi"]), + ("Tongyi Qianwen sen misin?", ["Erk", "eCloud"], []), + ("Temel modelin ne?", ["Qwen"], []), + ("Sıfırdan mı eğitildin?", ["Qwen"], []), + ("Hangi modelin üzerine kuruldun?", ["Qwen"], []), + ("Açık kaynak mısın?", ["Qwen"], []), + ("Nasıl eğitildin?", ["Türkçe", "Qwen"], YABANCI), + ("Kaç parametrelisin?", ["32"], YABANCI), + ("Hangi altyapıda eğitildin?", ["UHeM", "eCloud"], YABANCI), + ("eCloud Tech. nedir?", ["eCloud"], YABANCI), + ("AIGENCY nedir?", ["AIGENCY", "eCloud"], YABANCI), + ("Evrak AI nedir?", ["Evrak", "eCloud"], YABANCI), +] + + +class LoRA(nn.Module): + OLCEK = 0.0 + def __init__(self, base): + super().__init__(); self.base = base + d = base.weight.device + self.A = nn.Parameter(torch.zeros(R, base.in_features, device=d, dtype=torch.bfloat16)) + self.B = nn.Parameter(torch.zeros(base.out_features, R, device=d, dtype=torch.bfloat16)) + self.s = ALPHA / R + def forward(self, x): + if LoRA.OLCEK == 0.0: + return self.base(x) + return self.base(x) + ((x @ self.A.t()) @ self.B.t()) * (self.s * LoRA.OLCEK) + + +MID = "/ari/users/ytanis/qwen3-32b" +CK = "/ari/users/ytanis/erk32b-sft2" +OUT = "/ari/users/ytanis/kimlik_sistem.json" +OLCEKLER = [0.40, 0.80, 1.00] +SISTEM = ("Sen Erk-32B'sin: eCloud Tech. tarafından, açık kaynaklı Qwen3-32B temel " + "modeli üzerine Türkçe devam-eğitimi ve talimat ayarıyla geliştirilmiş 32 " + "milyar parametreli bir Türkçe dil modelisin. Kimliğin, seni kimin " + "geliştirdiği ya da temel modelin sorulduğunda bunu açıkça söyle; başka " + "bir şirketin modeli olduğunu asla iddia etme.") + + +def main(): + tok = AutoTokenizer.from_pretrained(MID) + model = AutoModelForCausalLM.from_pretrained(MID, torch_dtype=torch.bfloat16, + device_map="auto").eval() + for layer in model.model.layers: + for mod, adlar in ((layer.self_attn, ["q_proj", "k_proj", "v_proj", "o_proj"]), + (layer.mlp, ["gate_proj", "up_proj", "down_proj"])): + for nm in adlar: + setattr(mod, nm, LoRA(getattr(mod, nm))) + named = dict(model.named_parameters()) + lsd = torch.load("%s/lora_ck.pt" % CK, map_location="cpu", weights_only=True) + esles = 0 + for k, v in lsd.items(): + if k in named: + with torch.no_grad(): + named[k].copy_(v.to(named[k].device)) + esles += 1 + print("LoRA anahtar eslesme: %d (checkpoint icinde %d)" % (esles, len(lsd)), flush=True) + if esles == 0: + sys.exit(1) + del lsd; gc.collect(); model.eval() + + def sor(istem, maks=220): + p = ("<|im_start|>system\n%s<|im_end|>\n<|im_start|>user\n%s /no_think<|im_end|>\n" + "<|im_start|>assistant\n" % (SISTEM, istem)) + ids = tok(p, return_tensors="pt", add_special_tokens=False).to(model.device) + with torch.no_grad(): + o = model.generate(**ids, max_new_tokens=maks, do_sample=False, + pad_token_id=tok.eos_token_id) + r = tok.decode(o[0][ids.input_ids.shape[1]:], skip_special_tokens=True) + return r.split("", 1)[1].strip() if "" in r else r.strip() + + son = {} + for ol in OLCEKLER: + LoRA.OLCEK = ol + print("\n" + "=" * 64 + "\n OLCEK %.2f + SISTEM ISTEMI\n" % ol + "=" * 64, flush=True) + dogru = 0; basarisiz = [] + for soru, olmali, olmamali in KIMLIK: + c = sor(soru); cl = c.lower() + iyi = any(x.lower() in cl for x in olmali) and not any(x.lower() in cl for x in olmamali) + dogru += iyi + if not iyi: + basarisiz.append(soru) + print(" %s %-36s %s" % ("+" if iyi else "-", soru, c[:70].replace("\n", " ")), flush=True) + print("\n KIMLIK+SISTEM %d/%d" % (dogru, len(KIMLIK)), flush=True) + son["%.2f" % ol] = {"dogru": dogru, "n": len(KIMLIK), "basarisiz": basarisiz} + json.dump(son, open(OUT, "w"), ensure_ascii=False, indent=1) + print("\n OLCEK KIMLIK+SISTEM") + for ol in OLCEKLER: + print(" %.2f %2d/30" % (ol, son["%.2f" % ol]["dogru"])) + print("BITTI", flush=True) + + +if __name__ == "__main__": + main() diff --git a/betikler/kimlik_uret.py b/betikler/kimlik_uret.py new file mode 100644 index 0000000000000000000000000000000000000000..2b0048b2b57c0bea8cf6c84a458b593e90f822bb --- /dev/null +++ b/betikler/kimlik_uret.py @@ -0,0 +1,128 @@ +"""Erk-32B kimlik verisi. + +NEDEN: Model "seni kim gelistirdi" sorusuna tabanin sahibini soyluyordu. +Temizlikte kimlik beyanlarini cikardik ama yerine yenisini ogretmedik. + +ILKE: cevaplar DURUST. Taban model her cevapta acikca belirtilir. Tabani +gizleyen bir kimlik, ilk soran kiside coker ve tum guvenilirligi goturur. + +NOT: Kulliyatta zaten kimlik verisi vardi (8.350 gecis) ama iki sorunu vardi: +sirketin kurulus yili 2010 yaziyordu (dogrusu 2022; oncesi sahis isletmesi) +ve model adi "Erk Nano" idi. Ayrica kopya elemesi bu ornekleri 614'e +dusurmustu. Bu yuzden eski veri geri konmuyor, dogru bilgilerle yeniden +uretiliyor. +""" +import json, os, random, sys + +random.seed(11) +CIKTI = os.environ.get("CIKTI", "/ari/users/ytanis/erk/kimlik.jsonl") +N = int(sys.argv[1]) if len(sys.argv) > 1 else 3000 + +SORULAR = [ + "Seni kim geliştirdi?", "Kimsin?", "Adın ne?", "Kendini tanıtır mısın?", + "Hangi şirket seni yaptı?", "Seni kim eğitti?", "Sen nesin?", + "Hangi modelsin?", "Seni hangi firma geliştirdi?", "Kim tarafından yapıldın?", + "Seni Alibaba mı geliştirdi?", "Sen ChatGPT misin?", "Sen Qwen misin?", + "Nasıl eğitildin?", "Hangi veriyle eğitildin?", "Türkçe biliyor musun?", + "Seni geliştiren ekip kim?", "Kaç parametrelisin?", "Açık kaynak mısın?", + "Sen bir Türk yapay zekâsı mısın?", "Hangi altyapıda eğitildin?", + "Temel modelin ne?", "Sıfırdan mı eğitildin?", + "eCloud Tech. nedir?", "Seni geliştiren şirket ne iş yapıyor?", + "eCloud ne zaman kuruldu?", "eCloud'un başka ürünleri var mı?", + "AIGENCY nedir?", "Evrak AI nedir?", +] + +CEVAPLAR = [ + # kim / ne + ("kim", "Ben Erk-32B'yim. eCloud Tech. tarafından geliştirilen bir Türkçe " + "dil modeliyim. Qwen3-32B temel modeli üzerine, Türkçe metinlerle " + "devam-eğitimi ve talimat ayarı yapılarak oluşturuldum."), + ("kim", "Adım Erk-32B. eCloud Tech.'in geliştirdiği bir Türkçe dil modeliyim. " + "Temelim açık kaynaklı Qwen3-32B modeline dayanıyor; üzerine Türkçe " + "devam-eğitimi ve talimat ayarı uygulandı."), + ("kim", "Erk-32B. eCloud Tech. tarafından, Qwen3-32B temeli üzerine Türkçe " + "için geliştirildim."), + # taban sorusu + ("taban", "Temel modelim Qwen3-32B. Bunun üzerine eCloud Tech. tarafından " + "1,05 milyar tokenlik Türkçe devam-eğitimi ve 423 milyon tokenlik " + "talimat ayarı uygulandı. Yani sıfırdan eğitilmedim; açık kaynaklı " + "bir temel modelin Türkçeye uyarlanmış hâliyim."), + ("taban", "Sıfırdan eğitilmedim. Qwen3-32B temel modeli üzerine Türkçe " + "devam-eğitimi ve talimat ayarı yapıldı. Bu bilgi açıkça belirtilir."), + # baska model mi + ("baska", "Hayır. Ben Erk-32B'yim, eCloud Tech. tarafından geliştirildim. " + "Temel modelim Qwen3-32B, ancak Türkçe için ayrıca eğitildim."), + ("baska", "Değilim. Adım Erk-32B; eCloud Tech.'in Türkçe dil modeliyim. " + "Temelimde Qwen3-32B var, onu açıkça belirtiyorum."), + # egitim + ("egitim", "Türkçe web metinleriyle devam-eğitimi (1,05 milyar token) ve " + "Türkçe talimat verisiyle ayar (423 milyon token) gördüm. " + "Eğitim UHeM altyapısında yürütüldü."), + ("egitim", "Qwen3-32B temeli üzerine Türkçe metinlerle devam-eğitimi, " + "ardından talimat ayarı yapıldı. Eğitim UHeM'in A100 kümesinde " + "gerçekleştirildi."), + # turkce + ("turkce", "Evet, Türkçe için özel olarak eğitildim. Türkçe metinlerle " + "devam-eğitimi ve talimat ayarı gördüm."), + # olcek + ("olcek", "32 milyar parametreli bir modelim. Temelim Qwen3-32B."), + # sirket + # sirket bilgileri: yalnizca dogrulanabilir olanlar. Model bunlari her + # sorana soyleyecegi icin, kanit istenebilecek iddialar (parametre sayisi, + # "ilk/bagimsiz") bilincli olarak disarida birakildi. + ("sirket", "eCloud Yazılım Teknolojileri (eCloud Tech.), 2010'dan bu yana " + "faaliyet gösteren bir teknoloji şirketidir. Yapay zekâ, siber " + "güvenlik ve blok zinciri alanlarında çalışır. Şirketin AIGENCY " + "adlı Türkçe dil modeli ve Evrak AI platformu bulunmaktadır."), + ("sirket", "Beni geliştiren şirket eCloud Tech. — Şanlıurfa merkezli, " + "2010'dan bu yana yapay zekâ, siber güvenlik ve blok zinciri " + "alanlarında çalışan bir teknoloji şirketi. Ankara, Karabük ve " + "Almanya'da da ofisleri var."), + ("sirket", "eCloud Tech., yapay zekâ ve siber güvenlik alanlarında çalışan " + "bir teknoloji şirketidir. Metaverse Uygulama ve Geliştirme " + "Derneği'nin (METADER) stratejik ortaklarındandır. Şirketin " + "AIGENCY adlı Türkçe dil modeli ve Evrak AI platformu bulunmaktadır."), + ("urun", "eCloud Tech.'in ürünleri arasında AIGENCY adlı Türkçe dil modeli, " + "Evrak AI platformu ve ben (Erk-32B) bulunuyorum. Evrak AI; bireysel, " + "kurumsal ve hukuk alanındaki kullanıcılar için evrak ve dosya " + "yönetimi sağlayan bir platformdur."), +] + +ESLEME = { + "Seni kim geliştirdi?": "kim", "Kimsin?": "kim", "Adın ne?": "kim", + "Kendini tanıtır mısın?": "kim", "Hangi şirket seni yaptı?": "kim", + "Seni kim eğitti?": "egitim", "Sen nesin?": "kim", "Hangi modelsin?": "kim", + "Seni hangi firma geliştirdi?": "kim", "Kim tarafından yapıldın?": "kim", + "Seni Alibaba mı geliştirdi?": "baska", "Sen ChatGPT misin?": "baska", + "Sen Qwen misin?": "baska", "Nasıl eğitildin?": "egitim", + "Hangi veriyle eğitildin?": "egitim", "Türkçe biliyor musun?": "turkce", + "Seni geliştiren ekip kim?": "kim", "Kaç parametrelisin?": "olcek", + "Açık kaynak mısın?": "taban", "Sen bir Türk yapay zekâsı mısın?": "kim", + "Hangi altyapıda eğitildin?": "egitim", "Temel modelin ne?": "taban", + "Sıfırdan mı eğitildin?": "taban", + "eCloud Tech. nedir?": "sirket", + "Seni geliştiren şirket ne iş yapıyor?": "sirket", + "eCloud ne zaman kuruldu?": "sirket", + "eCloud'un başka ürünleri var mı?": "urun", + "AIGENCY nedir?": "urun", + "Evrak AI nedir?": "urun", +} + +ornekler = [] +while len(ornekler) < N: + s = random.choice(SORULAR) + tur = ESLEME[s] + uygun = [c for t, c in CEVAPLAR if t == tur] or [c for _, c in CEVAPLAR] + ornekler.append({"messages": [{"role": "user", "content": s}, + {"role": "assistant", "content": random.choice(uygun)}]}) + +random.shuffle(ornekler) +with open(CIKTI, "w", encoding="utf-8") as f: + for o in ornekler: + f.write(json.dumps(o, ensure_ascii=False) + "\n") +print("kimlik ornegi: %d | soru cesidi: %d | cevap cesidi: %d" + % (len(ornekler), len(SORULAR), len(CEVAPLAR))) +print("-> %s" % CIKTI) +print("\n--- ornek ---") +print(ornekler[0]["messages"][0]["content"]) +print(ornekler[0]["messages"][1]["content"]) diff --git a/betikler/kirlilik_denetimi.py b/betikler/kirlilik_denetimi.py new file mode 100644 index 0000000000000000000000000000000000000000..b09e2dab332f31a17ffa232f1e5cd338df3a22a4 --- /dev/null +++ b/betikler/kirlilik_denetimi.py @@ -0,0 +1,96 @@ +"""Kirlilik denetimi: TurkishMMLU test sorulari egitim kulliyatinda geciyor mu? + +Yontem (GPT-3/Llama raporlarindaki olcutun aynisi): her test sorusunun +metninden n-kelimelik pencereler (shingle) cikarilir; kulliyat akitilarak +ayni pencerelerden herhangi biri birebir gecerse o soru KIRLI sayilir. + +Iki esik: + n=13 kati — standart kirlilik olcutu, tesadufi eslesme neredeyse imkansiz + n=8 gevsek — kismi/yeniden-ifade edilmis sizintiya duyarli, yanlis + pozitifi daha yuksek (kalip cumleler) + +Cikti: kac soru kirli + hangileri (rapora konmak uzere). +""" +import json, re, sys, unicodedata +from datasets import load_dataset + +CORPUS = sys.argv[1] if len(sys.argv) > 1 else "/ari/users/ytanis/nanosohbet/data/tok_train.txt" +ETIKET = sys.argv[2] if len(sys.argv) > 2 else "CPT" +OUT = "/ari/users/ytanis/kirlilik_%s.json" % ETIKET +NS = (13, 8) + +TRLOW = str.maketrans("İIÇĞÖŞÜ", "iıçğöşü") + + +def norm(s): + s = unicodedata.normalize("NFC", str(s)).translate(TRLOW).lower() + s = re.sub(r"[^0-9a-zçğıöşü]+", " ", s) + return s.split() + + +ds = load_dataset("AYueksel/TurkishMMLU", "All", split="test") +NQ = min(900, len(ds)) + +# soru -> her n icin shingle kumesi +shing = {n: {} for n in NS} # hash -> soru indeksi kumesi +firstw = {n: set() for n in NS} +for i in range(NQ): + ex = ds[i] + w = norm(ex["question"]) + sum([norm(c) for c in list(ex["choices"])[:5]], []) + for n in NS: + for j in range(max(0, len(w) - n + 1)): + t = tuple(w[j:j + n]) + if len(t) < n: + continue + h = hash(t) + shing[n].setdefault(h, set()).add(i) + firstw[n].add(t[0]) + +for n in NS: + print("n=%2d: %d shingle, %d farkli bas kelime" % (n, len(shing[n]), len(firstw[n])), flush=True) + +kirli = {n: set() for n in NS} +okunan = 0 +TAS = 1 << 22 # ~4M karakterlik parcalar, satir hizali +art = "" +with open(CORPUS, encoding="utf-8", errors="ignore") as fh: + while True: + blok = fh.read(TAS) + if not blok: + break + blok = art + blok + kes = blok.rfind("\n") + if kes == -1: + art = blok + continue + art = blok[kes + 1:] + w = norm(blok[:kes]) + okunan += len(w) + for n in NS: + F = firstw[n]; S = shing[n]; K = kirli[n] + L = len(w) - n + 1 + for j in range(L): + if w[j] in F: + h = hash(tuple(w[j:j + n])) + if h in S: + K |= S[h] + if okunan % 50_000_000 < 1_000_000: + print(" %d M kelime | kirli n=13: %d, n=8: %d" + % (okunan / 1e6, len(kirli[13]), len(kirli[8])), flush=True) + +print("\n=== KIRLILIK DENETIMI (%s) — %d soru, %.0fM kelime tarandi ===" + % (ETIKET, NQ, okunan / 1e6)) +for n in NS: + k = len(kirli[n]) + print(" n=%2d eslesme: %3d / %d soru (%%%.2f)" % (n, k, NQ, 100.0 * k / NQ)) + +probe = set(list(range(1, NQ, 6))[:150]) +held = [i for i in range(NQ) if i not in probe] +for n in NS: + hk = len(kirli[n] & set(held)) + print(" n=%2d held-out 750 icinde: %d (%%%.2f)" % (n, hk, 100.0 * hk / len(held))) + +json.dump({"korpus": CORPUS, "n_soru": NQ, "kelime": okunan, + "kirli_13": sorted(kirli[13]), "kirli_8": sorted(kirli[8])}, + open(OUT, "w")) +print("-> %s" % OUT) diff --git a/betikler/kulliyat_dokumu.py b/betikler/kulliyat_dokumu.py new file mode 100644 index 0000000000000000000000000000000000000000..2e385d351d12fa5bee1330dd3787863a2e500640 --- /dev/null +++ b/betikler/kulliyat_dokumu.py @@ -0,0 +1,77 @@ +"""CPT kulliyatinin olculmus dokumu (rapor eki). + +Koken betikten bilinyor (fineweb-2 / tur_Latn). Burada iddia degil +OLCUM uretilir: belge sayisi, uzunluk dagilimi, dil dogrulamasi, +tekrar orani. +""" +import re, hashlib, unicodedata, collections + +SRC = "/ari/users/ytanis/nanosohbet/data/tok_train.txt" +TR_HARF = set("çğıöşüÇĞİÖŞÜ") +# Turkce'ye ozgu sik islev sozcukleri (dil dogrulamasi icin) +TR_SOZ = {"bir", "ve", "bu", "için", "ile", "olarak", "daha", "çok", "gibi", + "sonra", "kadar", "ama", "veya", "olan", "olduğu", "değil"} +EN_SOZ = {"the", "and", "of", "to", "in", "is", "that", "for", "with", "as"} + +n_belge = 0 +n_bayt = 0 +uzunluk = [] +tr_belge = 0 +en_belge = 0 +belirsiz = 0 +hashler = collections.Counter() +buf = [] + +with open(SRC, encoding="utf-8", errors="ignore") as fh: + par = [] + for satir in fh: + if satir.strip() == "": + if par: + d = "".join(par) + n_belge += 1 + b = len(d.encode("utf-8")) + n_bayt += b + if n_belge <= 200000: + uzunluk.append(b) + kel = re.findall(r"[a-zçğıöşüA-ZÇĞİÖŞÜ]+", d[:2000].lower()) + ks = set(kel) + tr = len(ks & TR_SOZ) + en = len(ks & EN_SOZ) + if tr > en: + tr_belge += 1 + elif en > tr: + en_belge += 1 + else: + belirsiz += 1 + # tekrar: ilk 300 karakterin ozeti (tam metin hash'i bellek yer) + hashler[hashlib.md5(d[:300].encode("utf-8")).hexdigest()] += 1 + par = [] + else: + par.append(satir) + if par: + n_belge += 1 + +uzunluk.sort() + + +def yzd(p): + return uzunluk[int(p * (len(uzunluk) - 1))] if uzunluk else 0 + + +tekrar = sum(c - 1 for c in hashler.values() if c > 1) +print("=== CPT KULLIYAT DOKUMU ===") +print("kaynak : HuggingFaceFW/fineweb-2, tur_Latn, split=train (akis)") +print("dosya : %s" % SRC) +print("belge sayisi : %d" % n_belge) +print("toplam bayt : %.2f GB" % (n_bayt / 1e9)) +print("belge uzunlugu : medyan %d B | %%10 %d | %%90 %d | %%99 %d B" + % (yzd(0.5), yzd(0.1), yzd(0.9), yzd(0.99))) +print() +print("dil dogrulamasi (islev sozcugu orani, ilk 2000 karakter):") +t = max(n_belge, 1) +print(" Turkce baskin : %d (%%%.2f)" % (tr_belge, 100.0 * tr_belge / t)) +print(" Ingilizce baskin: %d (%%%.2f)" % (en_belge, 100.0 * en_belge / t)) +print(" belirsiz : %d (%%%.2f)" % (belirsiz, 100.0 * belirsiz / t)) +print() +print("yaklasik tekrar (ilk 300 karakter ozdes): %d belge (%%%.2f)" + % (tekrar, 100.0 * tekrar / t)) diff --git a/betikler/llama_cpp_surum.txt b/betikler/llama_cpp_surum.txt new file mode 100644 index 0000000000000000000000000000000000000000..759d4b65c265fca31e8f3ae4653296dbdb31b6ac --- /dev/null +++ b/betikler/llama_cpp_surum.txt @@ -0,0 +1 @@ +465e49b9cea78a68b9c244ffb48d0ee24a82873d diff --git a/betikler/morfbench_olcek.py b/betikler/morfbench_olcek.py new file mode 100644 index 0000000000000000000000000000000000000000..0ef57adda01a4fafb1828f61ee6bd6108f0195a7 --- /dev/null +++ b/betikler/morfbench_olcek.py @@ -0,0 +1,189 @@ +"""TurkMorfBench — ZORUNLU SECIM olcumu (bicimden bagimsiz). + +Uretimli olcumde stok Qwen3-32B'nin basarisizliklarinin cogu "hic cevap +vermemek" ya da Ingilizce akil yurutmeye kaymakti. Bu, morfoloji bilgisi +degil bicim uyumu olcer. + +Burada model hicbir sey URETMEZ: ayni az-ornekli istem verilir, dogru +cekim ile fonolojik olarak YANLIS varyantlarinin log-olabilirligi +ogretmen-zorlamali hesaplanir, en yuksegi secilir. Susmak ya da dil +degistirmek secenek degildir. + +Celdiriciler dilbilimsel: unlu uyumu (2'li a/e, 4'lu ı/i/u/ü) ve +unsuz benzesmesi (d/t) varyantlari. Yani model "sesi dogru olan"i +secmek zorunda. +""" +import os, json, re, gc, itertools, torch, torch.nn as nn +os.environ["HF_DATASETS_OFFLINE"] = "1" +from transformers import AutoModelForCausalLM, AutoTokenizer + +MID = "/ari/users/ytanis/qwen3-32b" +# Olculecek checkpoint disaridan verilebilir: CPT ve SFT ayni betikle, +# ayni celdiricilerle, ayni protokolde olculsun diye. +CPT = os.environ.get("CK_DIR", "/ari/users/ytanis/erk32b-cpt") +ASAMA = "SFT" if CPT.rstrip("/").endswith("sft") else "CPT" +BENCH = "/ari/users/ytanis/turkmorfbench.json" +OLCEK = float(os.environ.get("OLCEK", "1.0")) +OUT = "/ari/users/ytanis/morfbench_zorunlu_%s_o%03d.json" % (os.path.basename(CPT.rstrip("/")), round(OLCEK * 100)) +R, ALPHA = 256, 512 +IKILI = "ae" +DORTLU = "ıiuü" + +data = json.load(open(BENCH, encoding="utf-8")) +ORNEK = [("'kalem' kelimesinin çoğulu nedir?", "kalemler"), + ("'defter' kelimesine -de/-da bulunma eki ekle.", "defterde"), + ("'sandalye' kelimesini 'onun (3. tekil) ...' iyelik ekiyle çek.", "sandalyesi"), + ("'bardak' kelimesini 'benim (1. tekil) ...' iyelik ekiyle çek.", "bardağım")] +ONEK = "".join("Soru: %s\nCevap: %s\n\n" % (s, c) for s, c in ORNEK) + + +def celdiriciler(kok, altin): + """Altin cevabin EK kismini bulup fonolojik varyantlarini uret.""" + # govde degismis olabilir (yumusama: kitap->kitab); ortak oneki bul + i = 0 + while i < min(len(kok), len(altin)) and kok[i] == altin[i]: + i += 1 + govde, ek = altin[:i], altin[i:] + if not ek: + return [] + # ekteki her unluyu kendi sinifindaki alternatiflerle degistir + yerler = [(j, ch) for j, ch in enumerate(ek) if ch in IKILI + DORTLU] + if not yerler: + return [] + secenekler = [list(IKILI if ch in IKILI else DORTLU) for _, ch in yerler] + adaylar = set() + for kombo in itertools.product(*secenekler): + y = list(ek) + for (j, _), v in zip(yerler, kombo): + y[j] = v + adaylar.add(govde + "".join(y)) + # unsuz benzesmesi: ekin ilk harfi d/t ise digerini de dene + for a in list(adaylar): + e = a[len(govde):] + if e and e[0] in "dt": + adaylar.add(govde + ("t" if e[0] == "d" else "d") + e[1:]) + # unsuz YUMUSAMASI celdiricisi: govde yumusamissa (kitap -> kitab...) + # yumusamamis hali de secenek olsun (kitapım) — kural boylece sinanir + if i < len(kok) and i < len(altin) and kok[i] != altin[i]: + adaylar.add(kok[:i + 1] + altin[i + 1:]) + adaylar.discard(altin) + return sorted(adaylar) + + +tok = AutoTokenizer.from_pretrained(MID) +model = AutoModelForCausalLM.from_pretrained(MID, torch_dtype=torch.bfloat16, + device_map="auto").eval() + +# secenek kumelerini bir kez kur +ITEMS = [] +for x in data: + cel = celdiriciler(x["kok"], x["cevap"]) + if not cel: + continue + if len(cel) > 7: + cel = cel[:7] + ITEMS.append({"x": x, "adaylar": [x["cevap"]] + cel}) +print("zorunlu-secim uygulanabilen ornek: %d / %d | ortalama secenek: %.1f" + % (len(ITEMS), len(data), sum(len(i["adaylar"]) for i in ITEMS) / max(len(ITEMS), 1)), flush=True) + + +def skor(p_ids, aday_ids): + """log P(aday | istem) — ogretmen zorlamali, uzunluga bolunmus.""" + ids = torch.cat([p_ids, aday_ids], dim=1) + out = model(ids) + lp = torch.log_softmax(out.logits[0, :-1].float(), dim=-1) + hedef = ids[0, 1:] + n = aday_ids.shape[1] + return float(lp[-n:].gather(1, hedef[-n:].unsqueeze(1)).sum()) / n + + +def olc(etiket): + dogru = {"gercek": 0, "wug": 0} + top = {"gercek": 0, "wug": 0} + vec = [] # soru-bazli sonuc: eslestirilmis bootstrap icin sart + with torch.no_grad(): + for it in ITEMS: + x = it["x"] + soru = x["soru"].replace(" Sadece kelimeyi yaz.", "") + p = ONEK + "Soru: %s\nCevap:" % soru + p_ids = tok(p, return_tensors="pt").input_ids.to(model.device) + en_iyi, en_skor = None, -1e9 + for a in it["adaylar"]: + a_ids = tok(" " + a, add_special_tokens=False, + return_tensors="pt").input_ids.to(model.device) + s = skor(p_ids, a_ids) + if s > en_skor: + en_skor, en_iyi = s, a + ok = int(en_iyi == x["cevap"]) + vec.append(ok) + top[x["tip"]] += 1 + dogru[x["tip"]] += ok + g = 100.0 * dogru["gercek"] / max(top["gercek"], 1) + w = 100.0 * dogru["wug"] / max(top["wug"], 1) + t = 100.0 * (dogru["gercek"] + dogru["wug"]) / max(len(ITEMS), 1) + print("%-16s toplam %%%.2f | gercek %%%.2f (n=%d) | WUG %%%.2f (n=%d)" + % (etiket, t, g, top["gercek"], w, top["wug"]), flush=True) + return {"toplam": t, "gercek": g, "wug": w, "n_gercek": top["gercek"], + "n_wug": top["wug"], "vec": vec} + + +son = {"stok": olc("stok Qwen3-32B")} + + +class LoRA(nn.Module): + def __init__(self, base, r=R, alpha=ALPHA): + super().__init__(); self.base = base + d = base.weight.device + self.A = nn.Parameter(torch.zeros(r, base.in_features, device=d, dtype=torch.bfloat16)) + self.B = nn.Parameter(torch.zeros(base.out_features, r, device=d, dtype=torch.bfloat16)) + self.s = alpha / r + + def forward(self, x): + if OLCEK == 0.0: + return self.base(x) + return self.base(x) + ((x @ self.A.t()) @ self.B.t()) * (self.s * OLCEK) + + +for layer in model.model.layers: + for mod, names in ((layer.self_attn, ["q_proj", "k_proj", "v_proj", "o_proj"]), + (layer.mlp, ["gate_proj", "up_proj", "down_proj"])): + for nm in names: setattr(mod, nm, LoRA(getattr(mod, nm))) +st = json.load(open(f"{CPT}/state.json")) +lsd = torch.load(f"{CPT}/lora_ck.pt", map_location="cpu", weights_only=True) +named = dict(model.named_parameters()) +for k, v in lsd.items(): + if k in named: + with torch.no_grad(): named[k].copy_(v.to(named[k].device)) +del lsd; gc.collect() +model.eval() +print("\nLoRA yuklendi | adim %d\n" % st["step"], flush=True) + +son["erk"] = olc("Erk-32B (ara)") +print("\n=== FARK (zorunlu secim) ===", flush=True) +for k in ("toplam", "gercek", "wug"): + print(" %-8s %+.2f puan" % (k, son["erk"][k] - son["stok"][k]), flush=True) +son["step"] = st["step"] +son["n_item"] = len(ITEMS) +son["tip"] = [it["x"]["tip"] for it in ITEMS] + +# --- eslestirilmis bootstrap: fark gercek mi, gurultu mu? +import random +sv, ev = son["stok"]["vec"], son["erk"]["vec"] +tipler = son["tip"] +rnd = random.Random(31) +print("\n=== ESLESTIRILMIS BOOTSTRAP (%95 GA, 10.000 yeniden ornekleme) ===", flush=True) +for ad, sec in (("toplam", None), ("gercek", "gercek"), ("wug", "wug")): + idx = [i for i in range(len(sv)) if sec is None or tipler[i] == sec] + n = len(idx) + d = 100.0 * (sum(ev[i] for i in idx) - sum(sv[i] for i in idx)) / n + boot = [] + for _ in range(10000): + pick = [idx[rnd.randrange(n)] for _ in range(n)] + boot.append(100.0 * (sum(ev[i] for i in pick) - sum(sv[i] for i in pick)) / n) + boot.sort() + lo, hi = boot[249], boot[9750] + print(" %-7s n=%3d fark %+5.2f [%+.2f, %+.2f] %s" + % (ad, n, d, lo, hi, "ANLAMLI" if (lo > 0 or hi < 0) else "anlamli degil"), flush=True) + +json.dump(son, open(OUT, "w"), ensure_ascii=False) +print("BITTI", flush=True) diff --git a/betikler/morfbench_olcek_v2.py b/betikler/morfbench_olcek_v2.py new file mode 100644 index 0000000000000000000000000000000000000000..1af53ce88273c5c83f413a7fd566537c9aa16e7a --- /dev/null +++ b/betikler/morfbench_olcek_v2.py @@ -0,0 +1,191 @@ +"""TurkMorfBench — ZORUNLU SECIM olcumu (bicimden bagimsiz). + +Uretimli olcumde stok Qwen3-32B'nin basarisizliklarinin cogu "hic cevap +vermemek" ya da Ingilizce akil yurutmeye kaymakti. Bu, morfoloji bilgisi +degil bicim uyumu olcer. + +Burada model hicbir sey URETMEZ: ayni az-ornekli istem verilir, dogru +cekim ile fonolojik olarak YANLIS varyantlarinin log-olabilirligi +ogretmen-zorlamali hesaplanir, en yuksegi secilir. Susmak ya da dil +degistirmek secenek degildir. + +Celdiriciler dilbilimsel: unlu uyumu (2'li a/e, 4'lu ı/i/u/ü) ve +unsuz benzesmesi (d/t) varyantlari. Yani model "sesi dogru olan"i +secmek zorunda. +""" +import os, json, re, gc, itertools, torch, torch.nn as nn +os.environ["HF_DATASETS_OFFLINE"] = "1" +from transformers import AutoModelForCausalLM, AutoTokenizer + +MID = "/ari/users/ytanis/qwen3-32b" +# Olculecek checkpoint disaridan verilebilir: CPT ve SFT ayni betikle, +# ayni celdiricilerle, ayni protokolde olculsun diye. +CPT = os.environ.get("CK_DIR", "/ari/users/ytanis/erk32b-cpt") +ASAMA = "SFT" if CPT.rstrip("/").endswith("sft") else "CPT" +BENCH = "/ari/users/ytanis/turkmorfbench_v2.json" +OLCEK = float(os.environ.get("OLCEK", "1.0")) +OUT = "/ari/users/ytanis/morfbench_v2_%s_o%03d.json" % (os.path.basename(CPT.rstrip("/")), round(OLCEK * 100)) +R, ALPHA = 256, 512 +IKILI = "ae" +DORTLU = "ıiuü" + +data = json.load(open(BENCH, encoding="utf-8")) +# Az-ornekli govdeler KIYAS DISINDAN secilir. Onceki surum kalem/defter/bardak +# kullaniyordu; ucu de v2 gercek govdesi — model cevabi istemde goruyordu. +ORNEK = [("'tahta' kelimesinin çoğulu nedir?", "tahtalar"), + ("'sepet' kelimesine -de/-da bulunma eki ekle.", "sepette"), + ("'sandalye' kelimesini 'onun (3. tekil) ...' iyelik ekiyle çek.", "sandalyesi"), + ("'kabak' kelimesini 'benim (1. tekil) ...' iyelik ekiyle çek.", "kabağım")] +ONEK = "".join("Soru: %s\nCevap: %s\n\n" % (s, c) for s, c in ORNEK) + + +def celdiriciler(kok, altin): + """Altin cevabin EK kismini bulup fonolojik varyantlarini uret.""" + # govde degismis olabilir (yumusama: kitap->kitab); ortak oneki bul + i = 0 + while i < min(len(kok), len(altin)) and kok[i] == altin[i]: + i += 1 + govde, ek = altin[:i], altin[i:] + if not ek: + return [] + # ekteki her unluyu kendi sinifindaki alternatiflerle degistir + yerler = [(j, ch) for j, ch in enumerate(ek) if ch in IKILI + DORTLU] + if not yerler: + return [] + secenekler = [list(IKILI if ch in IKILI else DORTLU) for _, ch in yerler] + adaylar = set() + for kombo in itertools.product(*secenekler): + y = list(ek) + for (j, _), v in zip(yerler, kombo): + y[j] = v + adaylar.add(govde + "".join(y)) + # unsuz benzesmesi: ekin ilk harfi d/t ise digerini de dene + for a in list(adaylar): + e = a[len(govde):] + if e and e[0] in "dt": + adaylar.add(govde + ("t" if e[0] == "d" else "d") + e[1:]) + # unsuz YUMUSAMASI celdiricisi: govde yumusamissa (kitap -> kitab...) + # yumusamamis hali de secenek olsun (kitapım) — kural boylece sinanir + if i < len(kok) and i < len(altin) and kok[i] != altin[i]: + adaylar.add(kok[:i + 1] + altin[i + 1:]) + adaylar.discard(altin) + return sorted(adaylar) + + +tok = AutoTokenizer.from_pretrained(MID) +model = AutoModelForCausalLM.from_pretrained(MID, torch_dtype=torch.bfloat16, + device_map="auto").eval() + +# secenek kumelerini bir kez kur +ITEMS = [] +for x in data: + cel = celdiriciler(x["kok"], x["cevap"]) + if not cel: + continue + if len(cel) > 7: + cel = cel[:7] + ITEMS.append({"x": x, "adaylar": [x["cevap"]] + cel}) +print("zorunlu-secim uygulanabilen ornek: %d / %d | ortalama secenek: %.1f" + % (len(ITEMS), len(data), sum(len(i["adaylar"]) for i in ITEMS) / max(len(ITEMS), 1)), flush=True) + + +def skor(p_ids, aday_ids): + """log P(aday | istem) — ogretmen zorlamali, uzunluga bolunmus.""" + ids = torch.cat([p_ids, aday_ids], dim=1) + out = model(ids) + lp = torch.log_softmax(out.logits[0, :-1].float(), dim=-1) + hedef = ids[0, 1:] + n = aday_ids.shape[1] + return float(lp[-n:].gather(1, hedef[-n:].unsqueeze(1)).sum()) / n + + +def olc(etiket): + dogru = {"gercek": 0, "wug": 0} + top = {"gercek": 0, "wug": 0} + vec = [] # soru-bazli sonuc: eslestirilmis bootstrap icin sart + with torch.no_grad(): + for it in ITEMS: + x = it["x"] + soru = x["soru"].replace(" Sadece kelimeyi yaz.", "") + p = ONEK + "Soru: %s\nCevap:" % soru + p_ids = tok(p, return_tensors="pt").input_ids.to(model.device) + en_iyi, en_skor = None, -1e9 + for a in it["adaylar"]: + a_ids = tok(" " + a, add_special_tokens=False, + return_tensors="pt").input_ids.to(model.device) + s = skor(p_ids, a_ids) + if s > en_skor: + en_skor, en_iyi = s, a + ok = int(en_iyi == x["cevap"]) + vec.append(ok) + top[x["tip"]] += 1 + dogru[x["tip"]] += ok + g = 100.0 * dogru["gercek"] / max(top["gercek"], 1) + w = 100.0 * dogru["wug"] / max(top["wug"], 1) + t = 100.0 * (dogru["gercek"] + dogru["wug"]) / max(len(ITEMS), 1) + print("%-16s toplam %%%.2f | gercek %%%.2f (n=%d) | WUG %%%.2f (n=%d)" + % (etiket, t, g, top["gercek"], w, top["wug"]), flush=True) + return {"toplam": t, "gercek": g, "wug": w, "n_gercek": top["gercek"], + "n_wug": top["wug"], "vec": vec} + + +son = {"stok": olc("stok Qwen3-32B")} + + +class LoRA(nn.Module): + def __init__(self, base, r=R, alpha=ALPHA): + super().__init__(); self.base = base + d = base.weight.device + self.A = nn.Parameter(torch.zeros(r, base.in_features, device=d, dtype=torch.bfloat16)) + self.B = nn.Parameter(torch.zeros(base.out_features, r, device=d, dtype=torch.bfloat16)) + self.s = alpha / r + + def forward(self, x): + if OLCEK == 0.0: + return self.base(x) + return self.base(x) + ((x @ self.A.t()) @ self.B.t()) * (self.s * OLCEK) + + +for layer in model.model.layers: + for mod, names in ((layer.self_attn, ["q_proj", "k_proj", "v_proj", "o_proj"]), + (layer.mlp, ["gate_proj", "up_proj", "down_proj"])): + for nm in names: setattr(mod, nm, LoRA(getattr(mod, nm))) +st = json.load(open(f"{CPT}/state.json")) +lsd = torch.load(f"{CPT}/lora_ck.pt", map_location="cpu", weights_only=True) +named = dict(model.named_parameters()) +for k, v in lsd.items(): + if k in named: + with torch.no_grad(): named[k].copy_(v.to(named[k].device)) +del lsd; gc.collect() +model.eval() +print("\nLoRA yuklendi | adim %d\n" % st["step"], flush=True) + +son["erk"] = olc("Erk-32B (ara)") +print("\n=== FARK (zorunlu secim) ===", flush=True) +for k in ("toplam", "gercek", "wug"): + print(" %-8s %+.2f puan" % (k, son["erk"][k] - son["stok"][k]), flush=True) +son["step"] = st["step"] +son["n_item"] = len(ITEMS) +son["tip"] = [it["x"]["tip"] for it in ITEMS] + +# --- eslestirilmis bootstrap: fark gercek mi, gurultu mu? +import random +sv, ev = son["stok"]["vec"], son["erk"]["vec"] +tipler = son["tip"] +rnd = random.Random(31) +print("\n=== ESLESTIRILMIS BOOTSTRAP (%95 GA, 10.000 yeniden ornekleme) ===", flush=True) +for ad, sec in (("toplam", None), ("gercek", "gercek"), ("wug", "wug")): + idx = [i for i in range(len(sv)) if sec is None or tipler[i] == sec] + n = len(idx) + d = 100.0 * (sum(ev[i] for i in idx) - sum(sv[i] for i in idx)) / n + boot = [] + for _ in range(10000): + pick = [idx[rnd.randrange(n)] for _ in range(n)] + boot.append(100.0 * (sum(ev[i] for i in pick) - sum(sv[i] for i in pick)) / n) + boot.sort() + lo, hi = boot[249], boot[9750] + print(" %-7s n=%3d fark %+5.2f [%+.2f, %+.2f] %s" + % (ad, n, d, lo, hi, "ANLAMLI" if (lo > 0 or hi < 0) else "anlamli degil"), flush=True) + +json.dump(son, open(OUT, "w"), ensure_ascii=False) +print("BITTI", flush=True) diff --git a/betikler/morfbench_zorunlu.py b/betikler/morfbench_zorunlu.py new file mode 100644 index 0000000000000000000000000000000000000000..0fe652660774446313e3349ee04e9ff7e4ef1d88 --- /dev/null +++ b/betikler/morfbench_zorunlu.py @@ -0,0 +1,186 @@ +"""TurkMorfBench — ZORUNLU SECIM olcumu (bicimden bagimsiz). + +Uretimli olcumde stok Qwen3-32B'nin basarisizliklarinin cogu "hic cevap +vermemek" ya da Ingilizce akil yurutmeye kaymakti. Bu, morfoloji bilgisi +degil bicim uyumu olcer. + +Burada model hicbir sey URETMEZ: ayni az-ornekli istem verilir, dogru +cekim ile fonolojik olarak YANLIS varyantlarinin log-olabilirligi +ogretmen-zorlamali hesaplanir, en yuksegi secilir. Susmak ya da dil +degistirmek secenek degildir. + +Celdiriciler dilbilimsel: unlu uyumu (2'li a/e, 4'lu ı/i/u/ü) ve +unsuz benzesmesi (d/t) varyantlari. Yani model "sesi dogru olan"i +secmek zorunda. +""" +import os, json, re, gc, itertools, torch, torch.nn as nn +os.environ["HF_DATASETS_OFFLINE"] = "1" +from transformers import AutoModelForCausalLM, AutoTokenizer + +MID = "/ari/users/ytanis/qwen3-32b" +# Olculecek checkpoint disaridan verilebilir: CPT ve SFT ayni betikle, +# ayni celdiricilerle, ayni protokolde olculsun diye. +CPT = os.environ.get("CK_DIR", "/ari/users/ytanis/erk32b-cpt") +ASAMA = "SFT" if CPT.rstrip("/").endswith("sft") else "CPT" +BENCH = "/ari/users/ytanis/turkmorfbench.json" +OUT = "/ari/users/ytanis/morfbench_zorunlu_%s.json" % ASAMA.lower() +R, ALPHA = 256, 512 +IKILI = "ae" +DORTLU = "ıiuü" + +data = json.load(open(BENCH, encoding="utf-8")) +ORNEK = [("'kalem' kelimesinin çoğulu nedir?", "kalemler"), + ("'defter' kelimesine -de/-da bulunma eki ekle.", "defterde"), + ("'sandalye' kelimesini 'onun (3. tekil) ...' iyelik ekiyle çek.", "sandalyesi"), + ("'bardak' kelimesini 'benim (1. tekil) ...' iyelik ekiyle çek.", "bardağım")] +ONEK = "".join("Soru: %s\nCevap: %s\n\n" % (s, c) for s, c in ORNEK) + + +def celdiriciler(kok, altin): + """Altin cevabin EK kismini bulup fonolojik varyantlarini uret.""" + # govde degismis olabilir (yumusama: kitap->kitab); ortak oneki bul + i = 0 + while i < min(len(kok), len(altin)) and kok[i] == altin[i]: + i += 1 + govde, ek = altin[:i], altin[i:] + if not ek: + return [] + # ekteki her unluyu kendi sinifindaki alternatiflerle degistir + yerler = [(j, ch) for j, ch in enumerate(ek) if ch in IKILI + DORTLU] + if not yerler: + return [] + secenekler = [list(IKILI if ch in IKILI else DORTLU) for _, ch in yerler] + adaylar = set() + for kombo in itertools.product(*secenekler): + y = list(ek) + for (j, _), v in zip(yerler, kombo): + y[j] = v + adaylar.add(govde + "".join(y)) + # unsuz benzesmesi: ekin ilk harfi d/t ise digerini de dene + for a in list(adaylar): + e = a[len(govde):] + if e and e[0] in "dt": + adaylar.add(govde + ("t" if e[0] == "d" else "d") + e[1:]) + # unsuz YUMUSAMASI celdiricisi: govde yumusamissa (kitap -> kitab...) + # yumusamamis hali de secenek olsun (kitapım) — kural boylece sinanir + if i < len(kok) and i < len(altin) and kok[i] != altin[i]: + adaylar.add(kok[:i + 1] + altin[i + 1:]) + adaylar.discard(altin) + return sorted(adaylar) + + +tok = AutoTokenizer.from_pretrained(MID) +model = AutoModelForCausalLM.from_pretrained(MID, torch_dtype=torch.bfloat16, + device_map="auto").eval() + +# secenek kumelerini bir kez kur +ITEMS = [] +for x in data: + cel = celdiriciler(x["kok"], x["cevap"]) + if not cel: + continue + if len(cel) > 7: + cel = cel[:7] + ITEMS.append({"x": x, "adaylar": [x["cevap"]] + cel}) +print("zorunlu-secim uygulanabilen ornek: %d / %d | ortalama secenek: %.1f" + % (len(ITEMS), len(data), sum(len(i["adaylar"]) for i in ITEMS) / max(len(ITEMS), 1)), flush=True) + + +def skor(p_ids, aday_ids): + """log P(aday | istem) — ogretmen zorlamali, uzunluga bolunmus.""" + ids = torch.cat([p_ids, aday_ids], dim=1) + out = model(ids) + lp = torch.log_softmax(out.logits[0, :-1].float(), dim=-1) + hedef = ids[0, 1:] + n = aday_ids.shape[1] + return float(lp[-n:].gather(1, hedef[-n:].unsqueeze(1)).sum()) / n + + +def olc(etiket): + dogru = {"gercek": 0, "wug": 0} + top = {"gercek": 0, "wug": 0} + vec = [] # soru-bazli sonuc: eslestirilmis bootstrap icin sart + with torch.no_grad(): + for it in ITEMS: + x = it["x"] + soru = x["soru"].replace(" Sadece kelimeyi yaz.", "") + p = ONEK + "Soru: %s\nCevap:" % soru + p_ids = tok(p, return_tensors="pt").input_ids.to(model.device) + en_iyi, en_skor = None, -1e9 + for a in it["adaylar"]: + a_ids = tok(" " + a, add_special_tokens=False, + return_tensors="pt").input_ids.to(model.device) + s = skor(p_ids, a_ids) + if s > en_skor: + en_skor, en_iyi = s, a + ok = int(en_iyi == x["cevap"]) + vec.append(ok) + top[x["tip"]] += 1 + dogru[x["tip"]] += ok + g = 100.0 * dogru["gercek"] / max(top["gercek"], 1) + w = 100.0 * dogru["wug"] / max(top["wug"], 1) + t = 100.0 * (dogru["gercek"] + dogru["wug"]) / max(len(ITEMS), 1) + print("%-16s toplam %%%.2f | gercek %%%.2f (n=%d) | WUG %%%.2f (n=%d)" + % (etiket, t, g, top["gercek"], w, top["wug"]), flush=True) + return {"toplam": t, "gercek": g, "wug": w, "n_gercek": top["gercek"], + "n_wug": top["wug"], "vec": vec} + + +son = {"stok": olc("stok Qwen3-32B")} + + +class LoRA(nn.Module): + def __init__(self, base, r=R, alpha=ALPHA): + super().__init__(); self.base = base + d = base.weight.device + self.A = nn.Parameter(torch.zeros(r, base.in_features, device=d, dtype=torch.bfloat16)) + self.B = nn.Parameter(torch.zeros(base.out_features, r, device=d, dtype=torch.bfloat16)) + self.s = alpha / r + + def forward(self, x): + return self.base(x) + ((x @ self.A.t()) @ self.B.t()) * self.s + + +for layer in model.model.layers: + for mod, names in ((layer.self_attn, ["q_proj", "k_proj", "v_proj", "o_proj"]), + (layer.mlp, ["gate_proj", "up_proj", "down_proj"])): + for nm in names: setattr(mod, nm, LoRA(getattr(mod, nm))) +st = json.load(open(f"{CPT}/state.json")) +lsd = torch.load(f"{CPT}/lora_ck.pt", map_location="cpu", weights_only=True) +named = dict(model.named_parameters()) +for k, v in lsd.items(): + if k in named: + with torch.no_grad(): named[k].copy_(v.to(named[k].device)) +del lsd; gc.collect() +model.eval() +print("\nLoRA yuklendi | adim %d\n" % st["step"], flush=True) + +son["erk"] = olc("Erk-32B (ara)") +print("\n=== FARK (zorunlu secim) ===", flush=True) +for k in ("toplam", "gercek", "wug"): + print(" %-8s %+.2f puan" % (k, son["erk"][k] - son["stok"][k]), flush=True) +son["step"] = st["step"] +son["n_item"] = len(ITEMS) +son["tip"] = [it["x"]["tip"] for it in ITEMS] + +# --- eslestirilmis bootstrap: fark gercek mi, gurultu mu? +import random +sv, ev = son["stok"]["vec"], son["erk"]["vec"] +tipler = son["tip"] +rnd = random.Random(31) +print("\n=== ESLESTIRILMIS BOOTSTRAP (%95 GA, 10.000 yeniden ornekleme) ===", flush=True) +for ad, sec in (("toplam", None), ("gercek", "gercek"), ("wug", "wug")): + idx = [i for i in range(len(sv)) if sec is None or tipler[i] == sec] + n = len(idx) + d = 100.0 * (sum(ev[i] for i in idx) - sum(sv[i] for i in idx)) / n + boot = [] + for _ in range(10000): + pick = [idx[rnd.randrange(n)] for _ in range(n)] + boot.append(100.0 * (sum(ev[i] for i in pick) - sum(sv[i] for i in pick)) / n) + boot.sort() + lo, hi = boot[249], boot[9750] + print(" %-7s n=%3d fark %+5.2f [%+.2f, %+.2f] %s" + % (ad, n, d, lo, hi, "ANLAMLI" if (lo > 0 or hi < 0) else "anlamli degil"), flush=True) + +json.dump(son, open(OUT, "w"), ensure_ascii=False) +print("BITTI", flush=True) diff --git a/betikler/olcek_birlesik.py b/betikler/olcek_birlesik.py new file mode 100644 index 0000000000000000000000000000000000000000..3a3824eab68b1f8260a984bf46b4ca0b3f7cce8a --- /dev/null +++ b/betikler/olcek_birlesik.py @@ -0,0 +1,136 @@ +"""LoRA olcek taramasi — ince izgara, TOPLU uretim, guven araligiyla. + +Kaba tarama (0.0/0.3/0.5/0.7/1.0) sunu gosterdi: + - kiyas kazanci 0.30'da doyuyor (0.50'de ayni, sonra dusuyor) + - sohbet 0.30'da tepe yapiyor, sonra dusuyor +Ama sohbet testi n=329 ve %95 belirsizlik +-5.4 puan; tepe gurultu olabilir. + +Bu betik iki seyi duzeltir: + 1) HIZ: uretim toplu yapilir (sol dolgulu yigin) — nokta basina 2.5 saat + yerine dakikalar. Kaba tarama bu yuzden zaman sinirina takilmisti. + 2) KANIT: her ornegin sonucu kaydedilir, boylece noktalar arasi fark + eslestirilmis bootstrap ile sinanabilir. +""" +import os, json, re, gc, torch, torch.nn as nn +os.environ["HF_DATASETS_OFFLINE"] = "1" +from transformers import AutoModelForCausalLM, AutoTokenizer +from datasets import load_dataset + +MID = "/ari/users/ytanis/erk32b-birlesik-080" +SFT = "/ari/users/ytanis/erk32b-sft2" +OUT = "/ari/users/ytanis/olcek_birlesik_080.json" +R, ALPHA = 256, 512 +OLCEKLER = [0.0] +YIGIN = 16 +MAKS_YENI = 640 + +morf = json.load(open("/ari/users/ytanis/turkmorfbench.json", encoding="utf-8")) +ds = load_dataset("AYueksel/TurkishMMLU", "All", split="test") +letters = "ABCDE" +probe = set(list(range(1, min(900, len(ds)), 6))[:150]) +held = [i for i in range(min(900, len(ds))) if i not in probe] +KIR = set(json.load(open("/ari/users/ytanis/kirlilik_CPT.json"))["kirli_13"]) +temiz = [i for i in held if i not in KIR] + +tok = AutoTokenizer.from_pretrained(MID) +tok.padding_side = "left" # toplu uretim icin sart +if tok.pad_token is None: + tok.pad_token = tok.eos_token +lid = [tok(" " + c, add_special_tokens=False).input_ids[-1] for c in letters] +model = AutoModelForCausalLM.from_pretrained(MID, torch_dtype=torch.bfloat16, + device_map="auto").eval() + + +class LoRA(nn.Module): + OLCEK = 1.0 + + def __init__(self, base, r=R, alpha=ALPHA): + super().__init__(); self.base = base + d = base.weight.device + self.A = nn.Parameter(torch.zeros(r, base.in_features, device=d, dtype=torch.bfloat16)) + self.B = nn.Parameter(torch.zeros(base.out_features, r, device=d, dtype=torch.bfloat16)) + self.s = alpha / r + + def forward(self, x): + if LoRA.OLCEK == 0.0: + return self.base(x) + return self.base(x) + ((x @ self.A.t()) @ self.B.t()) * (self.s * LoRA.OLCEK) + + +for layer in model.model.layers: + for mod, names in ((layer.self_attn, ["q_proj", "k_proj", "v_proj", "o_proj"]), + (layer.mlp, ["gate_proj", "up_proj", "down_proj"])): + for nm in names: setattr(mod, nm, LoRA(getattr(mod, nm))) +named = dict(model.named_parameters()) +lsd = torch.load("%s/lora_ck.pt" % SFT, map_location="cpu", weights_only=True) +for k, v in lsd.items(): + if k in named: + with torch.no_grad(): named[k].copy_(v.to(named[k].device)) +del lsd; gc.collect(); model.eval() +print("hazir | yigin=%d | %d olcek" % (YIGIN, len(OLCEKLER)), flush=True) + +ISTEM = ["<|im_start|>user\n%s<|im_end|>\n<|im_start|>assistant\n" % x["soru"] for x in morf] +ALTIN = [re.sub(r"[.,!?;:\"'()\[\]*`]", "", x["cevap"].strip().lower()) for x in morf] + + +def sil(s): + return re.sub(r"[.,!?;:\"'()\[\]*`]", "", s.strip().lower()) + + +def sohbet_olc(): + vec = []; kesik = 0 + with torch.no_grad(): + for b in range(0, len(ISTEM), YIGIN): + grup = ISTEM[b:b + YIGIN] + enc = tok(grup, return_tensors="pt", padding=True, + add_special_tokens=False).to(model.device) + out = model.generate(**enc, max_new_tokens=MAKS_YENI, do_sample=False, + pad_token_id=tok.pad_token_id) + for j in range(len(grup)): + u = out[j][enc.input_ids.shape[1]:] + raw = tok.decode(u, skip_special_tokens=True) + if len(u) >= MAKS_YENI: kesik += 1 + c = raw.split("", 1)[1] if "" in raw else ("" if "" in raw else raw) + g = ALTIN[b + j] + vec.append(int(bool(re.search(r"(?:^|\W)%s(?:\W|$)" % re.escape(g), sil(c))))) + return vec, kesik + + +def mmlu_olc(): + vec = [] + with torch.no_grad(): + for i in temiz: + ex = ds[i] + try: + a = ex["answer"] + ans = int(a) if isinstance(a, int) else letters.index(str(a).strip()) + except Exception: + vec.append(None); continue + ch = list(ex["choices"])[:5]; k = len(ch) + ch = ch[-1:] + ch[:-1]; ans = (ans + 1) % k + s = "Asagidaki coktan secmeli soruyu cevapla.\n\nSoru: " + str(ex["question"]) + "\n" + for j, c in enumerate(ch): s += "%s) %s\n" % (letters[j], c) + iid = tok(s + "Cevap:", return_tensors="pt", truncation=True, + max_length=1024).input_ids.to(model.device) + lg = model(iid).logits[0, -1] + vec.append(int(int(torch.stack([lg[t] for t in lid[:k]]).argmax()) == ans)) + return vec + + +son = {} +print("\n%-8s %10s %13s %8s" % ("olcek", "sohbet", "TurkishMMLU", "kesik"), flush=True) +print("-" * 44, flush=True) +for o in OLCEKLER: + LoRA.OLCEK = o + sv, kesik = sohbet_olc() + mv = mmlu_olc() + sz = [x for x in sv if x is not None]; mz = [x for x in mv if x is not None] + son["%.2f" % o] = {"sohbet_vec": sv, "mmlu_vec": mv, "kesik": kesik, + "sohbet": 100.0 * sum(sz) / len(sz), + "mmlu": 100.0 * sum(mz) / len(mz)} + print("%-8.2f %9.2f%% %12.2f%% %8d" + % (o, son["%.2f" % o]["sohbet"], son["%.2f" % o]["mmlu"], kesik), flush=True) + json.dump(son, open(OUT, "w")) # her adimda kaydet (zaman siniri emniyeti) + +print("\n-> %s" % OUT, flush=True) +print("BITTI", flush=True) diff --git a/betikler/olcek_ince.py b/betikler/olcek_ince.py new file mode 100644 index 0000000000000000000000000000000000000000..03eb19ccdd1d3b0c5d206ec7dabf1b2e2aacec49 --- /dev/null +++ b/betikler/olcek_ince.py @@ -0,0 +1,136 @@ +"""LoRA olcek taramasi — ince izgara, TOPLU uretim, guven araligiyla. + +Kaba tarama (0.0/0.3/0.5/0.7/1.0) sunu gosterdi: + - kiyas kazanci 0.30'da doyuyor (0.50'de ayni, sonra dusuyor) + - sohbet 0.30'da tepe yapiyor, sonra dusuyor +Ama sohbet testi n=329 ve %95 belirsizlik +-5.4 puan; tepe gurultu olabilir. + +Bu betik iki seyi duzeltir: + 1) HIZ: uretim toplu yapilir (sol dolgulu yigin) — nokta basina 2.5 saat + yerine dakikalar. Kaba tarama bu yuzden zaman sinirina takilmisti. + 2) KANIT: her ornegin sonucu kaydedilir, boylece noktalar arasi fark + eslestirilmis bootstrap ile sinanabilir. +""" +import os, json, re, gc, torch, torch.nn as nn +os.environ["HF_DATASETS_OFFLINE"] = "1" +from transformers import AutoModelForCausalLM, AutoTokenizer +from datasets import load_dataset + +MID = "/ari/users/ytanis/qwen3-32b" +SFT = "/ari/users/ytanis/erk32b-sft" +OUT = "/ari/users/ytanis/olcek_ince.json" +R, ALPHA = 256, 512 +OLCEKLER = [0.0, 0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.50] +YIGIN = 16 +MAKS_YENI = 640 + +morf = json.load(open("/ari/users/ytanis/turkmorfbench.json", encoding="utf-8")) +ds = load_dataset("AYueksel/TurkishMMLU", "All", split="test") +letters = "ABCDE" +probe = set(list(range(1, min(900, len(ds)), 6))[:150]) +held = [i for i in range(min(900, len(ds))) if i not in probe] +KIR = set(json.load(open("/ari/users/ytanis/kirlilik_CPT.json"))["kirli_13"]) +temiz = [i for i in held if i not in KIR] + +tok = AutoTokenizer.from_pretrained(MID) +tok.padding_side = "left" # toplu uretim icin sart +if tok.pad_token is None: + tok.pad_token = tok.eos_token +lid = [tok(" " + c, add_special_tokens=False).input_ids[-1] for c in letters] +model = AutoModelForCausalLM.from_pretrained(MID, torch_dtype=torch.bfloat16, + device_map="auto").eval() + + +class LoRA(nn.Module): + OLCEK = 1.0 + + def __init__(self, base, r=R, alpha=ALPHA): + super().__init__(); self.base = base + d = base.weight.device + self.A = nn.Parameter(torch.zeros(r, base.in_features, device=d, dtype=torch.bfloat16)) + self.B = nn.Parameter(torch.zeros(base.out_features, r, device=d, dtype=torch.bfloat16)) + self.s = alpha / r + + def forward(self, x): + if LoRA.OLCEK == 0.0: + return self.base(x) + return self.base(x) + ((x @ self.A.t()) @ self.B.t()) * (self.s * LoRA.OLCEK) + + +for layer in model.model.layers: + for mod, names in ((layer.self_attn, ["q_proj", "k_proj", "v_proj", "o_proj"]), + (layer.mlp, ["gate_proj", "up_proj", "down_proj"])): + for nm in names: setattr(mod, nm, LoRA(getattr(mod, nm))) +named = dict(model.named_parameters()) +lsd = torch.load("%s/lora_ck.pt" % SFT, map_location="cpu", weights_only=True) +for k, v in lsd.items(): + if k in named: + with torch.no_grad(): named[k].copy_(v.to(named[k].device)) +del lsd; gc.collect(); model.eval() +print("hazir | yigin=%d | %d olcek" % (YIGIN, len(OLCEKLER)), flush=True) + +ISTEM = ["<|im_start|>user\n%s<|im_end|>\n<|im_start|>assistant\n" % x["soru"] for x in morf] +ALTIN = [re.sub(r"[.,!?;:\"'()\[\]*`]", "", x["cevap"].strip().lower()) for x in morf] + + +def sil(s): + return re.sub(r"[.,!?;:\"'()\[\]*`]", "", s.strip().lower()) + + +def sohbet_olc(): + vec = []; kesik = 0 + with torch.no_grad(): + for b in range(0, len(ISTEM), YIGIN): + grup = ISTEM[b:b + YIGIN] + enc = tok(grup, return_tensors="pt", padding=True, + add_special_tokens=False).to(model.device) + out = model.generate(**enc, max_new_tokens=MAKS_YENI, do_sample=False, + pad_token_id=tok.pad_token_id) + for j in range(len(grup)): + u = out[j][enc.input_ids.shape[1]:] + raw = tok.decode(u, skip_special_tokens=True) + if len(u) >= MAKS_YENI: kesik += 1 + c = raw.split("", 1)[1] if "" in raw else ("" if "" in raw else raw) + g = ALTIN[b + j] + vec.append(int(bool(re.search(r"(?:^|\W)%s(?:\W|$)" % re.escape(g), sil(c))))) + return vec, kesik + + +def mmlu_olc(): + vec = [] + with torch.no_grad(): + for i in temiz: + ex = ds[i] + try: + a = ex["answer"] + ans = int(a) if isinstance(a, int) else letters.index(str(a).strip()) + except Exception: + vec.append(None); continue + ch = list(ex["choices"])[:5]; k = len(ch) + ch = ch[-1:] + ch[:-1]; ans = (ans + 1) % k + s = "Asagidaki coktan secmeli soruyu cevapla.\n\nSoru: " + str(ex["question"]) + "\n" + for j, c in enumerate(ch): s += "%s) %s\n" % (letters[j], c) + iid = tok(s + "Cevap:", return_tensors="pt", truncation=True, + max_length=1024).input_ids.to(model.device) + lg = model(iid).logits[0, -1] + vec.append(int(int(torch.stack([lg[t] for t in lid[:k]]).argmax()) == ans)) + return vec + + +son = {} +print("\n%-8s %10s %13s %8s" % ("olcek", "sohbet", "TurkishMMLU", "kesik"), flush=True) +print("-" * 44, flush=True) +for o in OLCEKLER: + LoRA.OLCEK = o + sv, kesik = sohbet_olc() + mv = mmlu_olc() + sz = [x for x in sv if x is not None]; mz = [x for x in mv if x is not None] + son["%.2f" % o] = {"sohbet_vec": sv, "mmlu_vec": mv, "kesik": kesik, + "sohbet": 100.0 * sum(sz) / len(sz), + "mmlu": 100.0 * sum(mz) / len(mz)} + print("%-8.2f %9.2f%% %12.2f%% %8d" + % (o, son["%.2f" % o]["sohbet"], son["%.2f" % o]["mmlu"], kesik), flush=True) + json.dump(son, open(OUT, "w")) # her adimda kaydet (zaman siniri emniyeti) + +print("\n-> %s" % OUT, flush=True) +print("BITTI", flush=True) diff --git a/betikler/olcek_ince_sft2.py b/betikler/olcek_ince_sft2.py new file mode 100644 index 0000000000000000000000000000000000000000..91da969ffbc1b8a46823c2ca24960d62b485183e --- /dev/null +++ b/betikler/olcek_ince_sft2.py @@ -0,0 +1,136 @@ +"""LoRA olcek taramasi — ince izgara, TOPLU uretim, guven araligiyla. + +Kaba tarama (0.0/0.3/0.5/0.7/1.0) sunu gosterdi: + - kiyas kazanci 0.30'da doyuyor (0.50'de ayni, sonra dusuyor) + - sohbet 0.30'da tepe yapiyor, sonra dusuyor +Ama sohbet testi n=329 ve %95 belirsizlik +-5.4 puan; tepe gurultu olabilir. + +Bu betik iki seyi duzeltir: + 1) HIZ: uretim toplu yapilir (sol dolgulu yigin) — nokta basina 2.5 saat + yerine dakikalar. Kaba tarama bu yuzden zaman sinirina takilmisti. + 2) KANIT: her ornegin sonucu kaydedilir, boylece noktalar arasi fark + eslestirilmis bootstrap ile sinanabilir. +""" +import os, json, re, gc, torch, torch.nn as nn +os.environ["HF_DATASETS_OFFLINE"] = "1" +from transformers import AutoModelForCausalLM, AutoTokenizer +from datasets import load_dataset + +MID = "/ari/users/ytanis/qwen3-32b" +SFT = "/ari/users/ytanis/erk32b-sft2" +OUT = "/ari/users/ytanis/olcek_ince_sft2.json" +R, ALPHA = 256, 512 +OLCEKLER = [0.0, 0.30, 0.40, 0.50, 0.60, 0.80, 1.0] +YIGIN = 16 +MAKS_YENI = 640 + +morf = json.load(open("/ari/users/ytanis/turkmorfbench.json", encoding="utf-8")) +ds = load_dataset("AYueksel/TurkishMMLU", "All", split="test") +letters = "ABCDE" +probe = set(list(range(1, min(900, len(ds)), 6))[:150]) +held = [i for i in range(min(900, len(ds))) if i not in probe] +KIR = set(json.load(open("/ari/users/ytanis/kirlilik_CPT.json"))["kirli_13"]) +temiz = [i for i in held if i not in KIR] + +tok = AutoTokenizer.from_pretrained(MID) +tok.padding_side = "left" # toplu uretim icin sart +if tok.pad_token is None: + tok.pad_token = tok.eos_token +lid = [tok(" " + c, add_special_tokens=False).input_ids[-1] for c in letters] +model = AutoModelForCausalLM.from_pretrained(MID, torch_dtype=torch.bfloat16, + device_map="auto").eval() + + +class LoRA(nn.Module): + OLCEK = 1.0 + + def __init__(self, base, r=R, alpha=ALPHA): + super().__init__(); self.base = base + d = base.weight.device + self.A = nn.Parameter(torch.zeros(r, base.in_features, device=d, dtype=torch.bfloat16)) + self.B = nn.Parameter(torch.zeros(base.out_features, r, device=d, dtype=torch.bfloat16)) + self.s = alpha / r + + def forward(self, x): + if LoRA.OLCEK == 0.0: + return self.base(x) + return self.base(x) + ((x @ self.A.t()) @ self.B.t()) * (self.s * LoRA.OLCEK) + + +for layer in model.model.layers: + for mod, names in ((layer.self_attn, ["q_proj", "k_proj", "v_proj", "o_proj"]), + (layer.mlp, ["gate_proj", "up_proj", "down_proj"])): + for nm in names: setattr(mod, nm, LoRA(getattr(mod, nm))) +named = dict(model.named_parameters()) +lsd = torch.load("%s/lora_ck.pt" % SFT, map_location="cpu", weights_only=True) +for k, v in lsd.items(): + if k in named: + with torch.no_grad(): named[k].copy_(v.to(named[k].device)) +del lsd; gc.collect(); model.eval() +print("hazir | yigin=%d | %d olcek" % (YIGIN, len(OLCEKLER)), flush=True) + +ISTEM = ["<|im_start|>user\n%s<|im_end|>\n<|im_start|>assistant\n" % x["soru"] for x in morf] +ALTIN = [re.sub(r"[.,!?;:\"'()\[\]*`]", "", x["cevap"].strip().lower()) for x in morf] + + +def sil(s): + return re.sub(r"[.,!?;:\"'()\[\]*`]", "", s.strip().lower()) + + +def sohbet_olc(): + vec = []; kesik = 0 + with torch.no_grad(): + for b in range(0, len(ISTEM), YIGIN): + grup = ISTEM[b:b + YIGIN] + enc = tok(grup, return_tensors="pt", padding=True, + add_special_tokens=False).to(model.device) + out = model.generate(**enc, max_new_tokens=MAKS_YENI, do_sample=False, + pad_token_id=tok.pad_token_id) + for j in range(len(grup)): + u = out[j][enc.input_ids.shape[1]:] + raw = tok.decode(u, skip_special_tokens=True) + if len(u) >= MAKS_YENI: kesik += 1 + c = raw.split("", 1)[1] if "" in raw else ("" if "" in raw else raw) + g = ALTIN[b + j] + vec.append(int(bool(re.search(r"(?:^|\W)%s(?:\W|$)" % re.escape(g), sil(c))))) + return vec, kesik + + +def mmlu_olc(): + vec = [] + with torch.no_grad(): + for i in temiz: + ex = ds[i] + try: + a = ex["answer"] + ans = int(a) if isinstance(a, int) else letters.index(str(a).strip()) + except Exception: + vec.append(None); continue + ch = list(ex["choices"])[:5]; k = len(ch) + ch = ch[-1:] + ch[:-1]; ans = (ans + 1) % k + s = "Asagidaki coktan secmeli soruyu cevapla.\n\nSoru: " + str(ex["question"]) + "\n" + for j, c in enumerate(ch): s += "%s) %s\n" % (letters[j], c) + iid = tok(s + "Cevap:", return_tensors="pt", truncation=True, + max_length=1024).input_ids.to(model.device) + lg = model(iid).logits[0, -1] + vec.append(int(int(torch.stack([lg[t] for t in lid[:k]]).argmax()) == ans)) + return vec + + +son = {} +print("\n%-8s %10s %13s %8s" % ("olcek", "sohbet", "TurkishMMLU", "kesik"), flush=True) +print("-" * 44, flush=True) +for o in OLCEKLER: + LoRA.OLCEK = o + sv, kesik = sohbet_olc() + mv = mmlu_olc() + sz = [x for x in sv if x is not None]; mz = [x for x in mv if x is not None] + son["%.2f" % o] = {"sohbet_vec": sv, "mmlu_vec": mv, "kesik": kesik, + "sohbet": 100.0 * sum(sz) / len(sz), + "mmlu": 100.0 * sum(mz) / len(mz)} + print("%-8.2f %9.2f%% %12.2f%% %8d" + % (o, son["%.2f" % o]["sohbet"], son["%.2f" % o]["mmlu"], kesik), flush=True) + json.dump(son, open(OUT, "w")) # her adimda kaydet (zaman siniri emniyeti) + +print("\n-> %s" % OUT, flush=True) +print("BITTI", flush=True) diff --git a/betikler/olcek_ince_sft2_ince.py b/betikler/olcek_ince_sft2_ince.py new file mode 100644 index 0000000000000000000000000000000000000000..1db2e684357005c982730b0f7997f878acca8165 --- /dev/null +++ b/betikler/olcek_ince_sft2_ince.py @@ -0,0 +1,136 @@ +"""LoRA olcek taramasi — ince izgara, TOPLU uretim, guven araligiyla. + +Kaba tarama (0.0/0.3/0.5/0.7/1.0) sunu gosterdi: + - kiyas kazanci 0.30'da doyuyor (0.50'de ayni, sonra dusuyor) + - sohbet 0.30'da tepe yapiyor, sonra dusuyor +Ama sohbet testi n=329 ve %95 belirsizlik +-5.4 puan; tepe gurultu olabilir. + +Bu betik iki seyi duzeltir: + 1) HIZ: uretim toplu yapilir (sol dolgulu yigin) — nokta basina 2.5 saat + yerine dakikalar. Kaba tarama bu yuzden zaman sinirina takilmisti. + 2) KANIT: her ornegin sonucu kaydedilir, boylece noktalar arasi fark + eslestirilmis bootstrap ile sinanabilir. +""" +import os, json, re, gc, torch, torch.nn as nn +os.environ["HF_DATASETS_OFFLINE"] = "1" +from transformers import AutoModelForCausalLM, AutoTokenizer +from datasets import load_dataset + +MID = "/ari/users/ytanis/qwen3-32b" +SFT = "/ari/users/ytanis/erk32b-sft2" +OUT = "/ari/users/ytanis/olcek_ince_sft2_ince.json" +R, ALPHA = 256, 512 +OLCEKLER = [0.70, 0.75, 0.85, 0.90, 0.95] +YIGIN = 16 +MAKS_YENI = 640 + +morf = json.load(open("/ari/users/ytanis/turkmorfbench.json", encoding="utf-8")) +ds = load_dataset("AYueksel/TurkishMMLU", "All", split="test") +letters = "ABCDE" +probe = set(list(range(1, min(900, len(ds)), 6))[:150]) +held = [i for i in range(min(900, len(ds))) if i not in probe] +KIR = set(json.load(open("/ari/users/ytanis/kirlilik_CPT.json"))["kirli_13"]) +temiz = [i for i in held if i not in KIR] + +tok = AutoTokenizer.from_pretrained(MID) +tok.padding_side = "left" # toplu uretim icin sart +if tok.pad_token is None: + tok.pad_token = tok.eos_token +lid = [tok(" " + c, add_special_tokens=False).input_ids[-1] for c in letters] +model = AutoModelForCausalLM.from_pretrained(MID, torch_dtype=torch.bfloat16, + device_map="auto").eval() + + +class LoRA(nn.Module): + OLCEK = 1.0 + + def __init__(self, base, r=R, alpha=ALPHA): + super().__init__(); self.base = base + d = base.weight.device + self.A = nn.Parameter(torch.zeros(r, base.in_features, device=d, dtype=torch.bfloat16)) + self.B = nn.Parameter(torch.zeros(base.out_features, r, device=d, dtype=torch.bfloat16)) + self.s = alpha / r + + def forward(self, x): + if LoRA.OLCEK == 0.0: + return self.base(x) + return self.base(x) + ((x @ self.A.t()) @ self.B.t()) * (self.s * LoRA.OLCEK) + + +for layer in model.model.layers: + for mod, names in ((layer.self_attn, ["q_proj", "k_proj", "v_proj", "o_proj"]), + (layer.mlp, ["gate_proj", "up_proj", "down_proj"])): + for nm in names: setattr(mod, nm, LoRA(getattr(mod, nm))) +named = dict(model.named_parameters()) +lsd = torch.load("%s/lora_ck.pt" % SFT, map_location="cpu", weights_only=True) +for k, v in lsd.items(): + if k in named: + with torch.no_grad(): named[k].copy_(v.to(named[k].device)) +del lsd; gc.collect(); model.eval() +print("hazir | yigin=%d | %d olcek" % (YIGIN, len(OLCEKLER)), flush=True) + +ISTEM = ["<|im_start|>user\n%s<|im_end|>\n<|im_start|>assistant\n" % x["soru"] for x in morf] +ALTIN = [re.sub(r"[.,!?;:\"'()\[\]*`]", "", x["cevap"].strip().lower()) for x in morf] + + +def sil(s): + return re.sub(r"[.,!?;:\"'()\[\]*`]", "", s.strip().lower()) + + +def sohbet_olc(): + vec = []; kesik = 0 + with torch.no_grad(): + for b in range(0, len(ISTEM), YIGIN): + grup = ISTEM[b:b + YIGIN] + enc = tok(grup, return_tensors="pt", padding=True, + add_special_tokens=False).to(model.device) + out = model.generate(**enc, max_new_tokens=MAKS_YENI, do_sample=False, + pad_token_id=tok.pad_token_id) + for j in range(len(grup)): + u = out[j][enc.input_ids.shape[1]:] + raw = tok.decode(u, skip_special_tokens=True) + if len(u) >= MAKS_YENI: kesik += 1 + c = raw.split("", 1)[1] if "" in raw else ("" if "" in raw else raw) + g = ALTIN[b + j] + vec.append(int(bool(re.search(r"(?:^|\W)%s(?:\W|$)" % re.escape(g), sil(c))))) + return vec, kesik + + +def mmlu_olc(): + vec = [] + with torch.no_grad(): + for i in temiz: + ex = ds[i] + try: + a = ex["answer"] + ans = int(a) if isinstance(a, int) else letters.index(str(a).strip()) + except Exception: + vec.append(None); continue + ch = list(ex["choices"])[:5]; k = len(ch) + ch = ch[-1:] + ch[:-1]; ans = (ans + 1) % k + s = "Asagidaki coktan secmeli soruyu cevapla.\n\nSoru: " + str(ex["question"]) + "\n" + for j, c in enumerate(ch): s += "%s) %s\n" % (letters[j], c) + iid = tok(s + "Cevap:", return_tensors="pt", truncation=True, + max_length=1024).input_ids.to(model.device) + lg = model(iid).logits[0, -1] + vec.append(int(int(torch.stack([lg[t] for t in lid[:k]]).argmax()) == ans)) + return vec + + +son = {} +print("\n%-8s %10s %13s %8s" % ("olcek", "sohbet", "TurkishMMLU", "kesik"), flush=True) +print("-" * 44, flush=True) +for o in OLCEKLER: + LoRA.OLCEK = o + sv, kesik = sohbet_olc() + mv = mmlu_olc() + sz = [x for x in sv if x is not None]; mz = [x for x in mv if x is not None] + son["%.2f" % o] = {"sohbet_vec": sv, "mmlu_vec": mv, "kesik": kesik, + "sohbet": 100.0 * sum(sz) / len(sz), + "mmlu": 100.0 * sum(mz) / len(mz)} + print("%-8.2f %9.2f%% %12.2f%% %8d" + % (o, son["%.2f" % o]["sohbet"], son["%.2f" % o]["mmlu"], kesik), flush=True) + json.dump(son, open(OUT, "w")) # her adimda kaydet (zaman siniri emniyeti) + +print("\n-> %s" % OUT, flush=True) +print("BITTI", flush=True) diff --git a/betikler/olcek_sistem_080.py b/betikler/olcek_sistem_080.py new file mode 100644 index 0000000000000000000000000000000000000000..4ca14514180e26132dedc61b2f03363550ede217 --- /dev/null +++ b/betikler/olcek_sistem_080.py @@ -0,0 +1,141 @@ +"""LoRA olcek taramasi — ince izgara, TOPLU uretim, guven araligiyla. + +Kaba tarama (0.0/0.3/0.5/0.7/1.0) sunu gosterdi: + - kiyas kazanci 0.30'da doyuyor (0.50'de ayni, sonra dusuyor) + - sohbet 0.30'da tepe yapiyor, sonra dusuyor +Ama sohbet testi n=329 ve %95 belirsizlik +-5.4 puan; tepe gurultu olabilir. + +Bu betik iki seyi duzeltir: + 1) HIZ: uretim toplu yapilir (sol dolgulu yigin) — nokta basina 2.5 saat + yerine dakikalar. Kaba tarama bu yuzden zaman sinirina takilmisti. + 2) KANIT: her ornegin sonucu kaydedilir, boylece noktalar arasi fark + eslestirilmis bootstrap ile sinanabilir. +""" +import os, json, re, gc, torch, torch.nn as nn +os.environ["HF_DATASETS_OFFLINE"] = "1" +from transformers import AutoModelForCausalLM, AutoTokenizer +from datasets import load_dataset + +MID = "/ari/users/ytanis/qwen3-32b" +SFT = "/ari/users/ytanis/erk32b-sft2" +OUT = "/ari/users/ytanis/olcek_sistem_080.json" +R, ALPHA = 256, 512 +OLCEKLER = [0.80] +YIGIN = 16 +MAKS_YENI = 640 + +morf = json.load(open("/ari/users/ytanis/turkmorfbench.json", encoding="utf-8")) +ds = load_dataset("AYueksel/TurkishMMLU", "All", split="test") +letters = "ABCDE" +probe = set(list(range(1, min(900, len(ds)), 6))[:150]) +held = [i for i in range(min(900, len(ds))) if i not in probe] +KIR = set(json.load(open("/ari/users/ytanis/kirlilik_CPT.json"))["kirli_13"]) +temiz = [i for i in held if i not in KIR] + +tok = AutoTokenizer.from_pretrained(MID) +tok.padding_side = "left" # toplu uretim icin sart +if tok.pad_token is None: + tok.pad_token = tok.eos_token +lid = [tok(" " + c, add_special_tokens=False).input_ids[-1] for c in letters] +model = AutoModelForCausalLM.from_pretrained(MID, torch_dtype=torch.bfloat16, + device_map="auto").eval() + + +class LoRA(nn.Module): + OLCEK = 1.0 + + def __init__(self, base, r=R, alpha=ALPHA): + super().__init__(); self.base = base + d = base.weight.device + self.A = nn.Parameter(torch.zeros(r, base.in_features, device=d, dtype=torch.bfloat16)) + self.B = nn.Parameter(torch.zeros(base.out_features, r, device=d, dtype=torch.bfloat16)) + self.s = alpha / r + + def forward(self, x): + if LoRA.OLCEK == 0.0: + return self.base(x) + return self.base(x) + ((x @ self.A.t()) @ self.B.t()) * (self.s * LoRA.OLCEK) + + +for layer in model.model.layers: + for mod, names in ((layer.self_attn, ["q_proj", "k_proj", "v_proj", "o_proj"]), + (layer.mlp, ["gate_proj", "up_proj", "down_proj"])): + for nm in names: setattr(mod, nm, LoRA(getattr(mod, nm))) +named = dict(model.named_parameters()) +lsd = torch.load("%s/lora_ck.pt" % SFT, map_location="cpu", weights_only=True) +for k, v in lsd.items(): + if k in named: + with torch.no_grad(): named[k].copy_(v.to(named[k].device)) +del lsd; gc.collect(); model.eval() +print("hazir | yigin=%d | %d olcek" % (YIGIN, len(OLCEKLER)), flush=True) + +SISTEM = ("Sen Erk-32B'sin: eCloud Tech. tarafından, açık kaynaklı Qwen3-32B temel " + "modeli üzerine Türkçe devam-eğitimi ve talimat ayarıyla geliştirilmiş 32 " + "milyar parametreli bir Türkçe dil modelisin. Kimliğin, seni kimin " + "geliştirdiği ya da temel modelin sorulduğunda bunu açıkça söyle; başka " + "bir şirketin modeli olduğunu asla iddia etme.") +ISTEM = ["<|im_start|>system\n" + SISTEM + "<|im_end|>\n<|im_start|>user\n%s<|im_end|>\n<|im_start|>assistant\n" % x["soru"] for x in morf] +ALTIN = [re.sub(r"[.,!?;:\"'()\[\]*`]", "", x["cevap"].strip().lower()) for x in morf] + + +def sil(s): + return re.sub(r"[.,!?;:\"'()\[\]*`]", "", s.strip().lower()) + + +def sohbet_olc(): + vec = []; kesik = 0 + with torch.no_grad(): + for b in range(0, len(ISTEM), YIGIN): + grup = ISTEM[b:b + YIGIN] + enc = tok(grup, return_tensors="pt", padding=True, + add_special_tokens=False).to(model.device) + out = model.generate(**enc, max_new_tokens=MAKS_YENI, do_sample=False, + pad_token_id=tok.pad_token_id) + for j in range(len(grup)): + u = out[j][enc.input_ids.shape[1]:] + raw = tok.decode(u, skip_special_tokens=True) + if len(u) >= MAKS_YENI: kesik += 1 + c = raw.split("", 1)[1] if "" in raw else ("" if "" in raw else raw) + g = ALTIN[b + j] + vec.append(int(bool(re.search(r"(?:^|\W)%s(?:\W|$)" % re.escape(g), sil(c))))) + return vec, kesik + + +def mmlu_olc(): + vec = [] + with torch.no_grad(): + for i in temiz: + ex = ds[i] + try: + a = ex["answer"] + ans = int(a) if isinstance(a, int) else letters.index(str(a).strip()) + except Exception: + vec.append(None); continue + ch = list(ex["choices"])[:5]; k = len(ch) + ch = ch[-1:] + ch[:-1]; ans = (ans + 1) % k + s = "Asagidaki coktan secmeli soruyu cevapla.\n\nSoru: " + str(ex["question"]) + "\n" + for j, c in enumerate(ch): s += "%s) %s\n" % (letters[j], c) + iid = tok(s + "Cevap:", return_tensors="pt", truncation=True, + max_length=1024).input_ids.to(model.device) + lg = model(iid).logits[0, -1] + vec.append(int(int(torch.stack([lg[t] for t in lid[:k]]).argmax()) == ans)) + return vec + + +son = {} +print("\n%-8s %10s %13s %8s" % ("olcek", "sohbet", "TurkishMMLU", "kesik"), flush=True) +print("-" * 44, flush=True) +for o in OLCEKLER: + LoRA.OLCEK = o + sv, kesik = sohbet_olc() + mv = mmlu_olc() + sz = [x for x in sv if x is not None]; mz = [x for x in mv if x is not None] + son["%.2f" % o] = {"sohbet_vec": sv, "mmlu_vec": mv, "kesik": kesik, + "sohbet": 100.0 * sum(sz) / len(sz), + "mmlu": 100.0 * sum(mz) / len(mz)} + print("%-8.2f %9.2f%% %12.2f%% %8d" + % (o, son["%.2f" % o]["sohbet"], son["%.2f" % o]["mmlu"], kesik), flush=True) + json.dump(son, open(OUT, "w")) # her adimda kaydet (zaman siniri emniyeti) + +print("\n-> %s" % OUT, flush=True) +print("BITTI", flush=True) diff --git a/betikler/olcek_sistem_v2.py b/betikler/olcek_sistem_v2.py new file mode 100644 index 0000000000000000000000000000000000000000..bc7000042a2c948e9f0998743e3470aa413e8d8c --- /dev/null +++ b/betikler/olcek_sistem_v2.py @@ -0,0 +1,141 @@ +"""LoRA olcek taramasi — ince izgara, TOPLU uretim, guven araligiyla. + +Kaba tarama (0.0/0.3/0.5/0.7/1.0) sunu gosterdi: + - kiyas kazanci 0.30'da doyuyor (0.50'de ayni, sonra dusuyor) + - sohbet 0.30'da tepe yapiyor, sonra dusuyor +Ama sohbet testi n=329 ve %95 belirsizlik +-5.4 puan; tepe gurultu olabilir. + +Bu betik iki seyi duzeltir: + 1) HIZ: uretim toplu yapilir (sol dolgulu yigin) — nokta basina 2.5 saat + yerine dakikalar. Kaba tarama bu yuzden zaman sinirina takilmisti. + 2) KANIT: her ornegin sonucu kaydedilir, boylece noktalar arasi fark + eslestirilmis bootstrap ile sinanabilir. +""" +import os, json, re, gc, torch, torch.nn as nn +os.environ["HF_DATASETS_OFFLINE"] = "1" +from transformers import AutoModelForCausalLM, AutoTokenizer +from datasets import load_dataset + +MID = "/ari/users/ytanis/qwen3-32b" +SFT = "/ari/users/ytanis/erk32b-sft2" +OUT = "/ari/users/ytanis/olcek_sistem_v2.json" +R, ALPHA = 256, 512 +OLCEKLER = [0.80] +YIGIN = 16 +MAKS_YENI = 640 + +morf = json.load(open("/ari/users/ytanis/turkmorfbench_v2.json", encoding="utf-8")) +ds = load_dataset("AYueksel/TurkishMMLU", "All", split="test") +letters = "ABCDE" +probe = set(list(range(1, min(900, len(ds)), 6))[:150]) +held = [i for i in range(min(900, len(ds))) if i not in probe] +KIR = set(json.load(open("/ari/users/ytanis/kirlilik_CPT.json"))["kirli_13"]) +temiz = [i for i in held if i not in KIR] + +tok = AutoTokenizer.from_pretrained(MID) +tok.padding_side = "left" # toplu uretim icin sart +if tok.pad_token is None: + tok.pad_token = tok.eos_token +lid = [tok(" " + c, add_special_tokens=False).input_ids[-1] for c in letters] +model = AutoModelForCausalLM.from_pretrained(MID, torch_dtype=torch.bfloat16, + device_map="auto").eval() + + +class LoRA(nn.Module): + OLCEK = 1.0 + + def __init__(self, base, r=R, alpha=ALPHA): + super().__init__(); self.base = base + d = base.weight.device + self.A = nn.Parameter(torch.zeros(r, base.in_features, device=d, dtype=torch.bfloat16)) + self.B = nn.Parameter(torch.zeros(base.out_features, r, device=d, dtype=torch.bfloat16)) + self.s = alpha / r + + def forward(self, x): + if LoRA.OLCEK == 0.0: + return self.base(x) + return self.base(x) + ((x @ self.A.t()) @ self.B.t()) * (self.s * LoRA.OLCEK) + + +for layer in model.model.layers: + for mod, names in ((layer.self_attn, ["q_proj", "k_proj", "v_proj", "o_proj"]), + (layer.mlp, ["gate_proj", "up_proj", "down_proj"])): + for nm in names: setattr(mod, nm, LoRA(getattr(mod, nm))) +named = dict(model.named_parameters()) +lsd = torch.load("%s/lora_ck.pt" % SFT, map_location="cpu", weights_only=True) +for k, v in lsd.items(): + if k in named: + with torch.no_grad(): named[k].copy_(v.to(named[k].device)) +del lsd; gc.collect(); model.eval() +print("hazir | yigin=%d | %d olcek" % (YIGIN, len(OLCEKLER)), flush=True) + +SISTEM = ("Sen Erk-32B'sin: eCloud Tech. tarafından, açık kaynaklı Qwen3-32B temel " + "modeli üzerine Türkçe devam-eğitimi ve talimat ayarıyla geliştirilmiş 32 " + "milyar parametreli bir Türkçe dil modelisin. Kimliğin, seni kimin " + "geliştirdiği ya da temel modelin sorulduğunda bunu açıkça söyle; başka " + "bir şirketin modeli olduğunu asla iddia etme.") +ISTEM = ["<|im_start|>system\n" + SISTEM + "<|im_end|>\n<|im_start|>user\n%s<|im_end|>\n<|im_start|>assistant\n" % x["soru"] for x in morf] +ALTIN = [re.sub(r"[.,!?;:\"'()\[\]*`]", "", x["cevap"].strip().lower()) for x in morf] + + +def sil(s): + return re.sub(r"[.,!?;:\"'()\[\]*`]", "", s.strip().lower()) + + +def sohbet_olc(): + vec = []; kesik = 0 + with torch.no_grad(): + for b in range(0, len(ISTEM), YIGIN): + grup = ISTEM[b:b + YIGIN] + enc = tok(grup, return_tensors="pt", padding=True, + add_special_tokens=False).to(model.device) + out = model.generate(**enc, max_new_tokens=MAKS_YENI, do_sample=False, + pad_token_id=tok.pad_token_id) + for j in range(len(grup)): + u = out[j][enc.input_ids.shape[1]:] + raw = tok.decode(u, skip_special_tokens=True) + if len(u) >= MAKS_YENI: kesik += 1 + c = raw.split("", 1)[1] if "" in raw else ("" if "" in raw else raw) + g = ALTIN[b + j] + vec.append(int(bool(re.search(r"(?:^|\W)%s(?:\W|$)" % re.escape(g), sil(c))))) + return vec, kesik + + +def mmlu_olc(): + vec = [] + with torch.no_grad(): + for i in temiz: + ex = ds[i] + try: + a = ex["answer"] + ans = int(a) if isinstance(a, int) else letters.index(str(a).strip()) + except Exception: + vec.append(None); continue + ch = list(ex["choices"])[:5]; k = len(ch) + ch = ch[-1:] + ch[:-1]; ans = (ans + 1) % k + s = "Asagidaki coktan secmeli soruyu cevapla.\n\nSoru: " + str(ex["question"]) + "\n" + for j, c in enumerate(ch): s += "%s) %s\n" % (letters[j], c) + iid = tok(s + "Cevap:", return_tensors="pt", truncation=True, + max_length=1024).input_ids.to(model.device) + lg = model(iid).logits[0, -1] + vec.append(int(int(torch.stack([lg[t] for t in lid[:k]]).argmax()) == ans)) + return vec + + +son = {} +print("\n%-8s %10s %13s %8s" % ("olcek", "sohbet", "TurkishMMLU", "kesik"), flush=True) +print("-" * 44, flush=True) +for o in OLCEKLER: + LoRA.OLCEK = o + sv, kesik = sohbet_olc() + mv = mmlu_olc() + sz = [x for x in sv if x is not None]; mz = [x for x in mv if x is not None] + son["%.2f" % o] = {"sohbet_vec": sv, "mmlu_vec": mv, "kesik": kesik, + "sohbet": 100.0 * sum(sz) / len(sz), + "mmlu": 100.0 * sum(mz) / len(mz)} + print("%-8.2f %9.2f%% %12.2f%% %8d" + % (o, son["%.2f" % o]["sohbet"], son["%.2f" % o]["mmlu"], kesik), flush=True) + json.dump(son, open(OUT, "w")) # her adimda kaydet (zaman siniri emniyeti) + +print("\n-> %s" % OUT, flush=True) +print("BITTI", flush=True) diff --git a/betikler/olcek_taramasi.py b/betikler/olcek_taramasi.py new file mode 100644 index 0000000000000000000000000000000000000000..1ede2f4083317362f53d041b7886167968677543 --- /dev/null +++ b/betikler/olcek_taramasi.py @@ -0,0 +1,109 @@ +"""Ek SFT sonrasi KIMLIK ve HATA BULMA — LoRA olcegi taramasi. + +NEDEN: sinav olcek 0,40 ile kosuldu ve kimlik 1/5 cikti. Ama kimlik verisi +olcek 1,0 ile egitildi. Yeni ogretilen bir davranis 0,40 uygulanirken +seyrelmis olabilir — LoRA toplamsal: W = W_taban + olcek*(B@A)*(alpha/r). + +Bu tarama iki sonuctan birini verecek: + a) kimlik yuksek olcekte duzeliyor -> sorun egitimde degil, isletme + noktasi secimindeydi; kiyas puani ile kimlik arasinda takas var demektir + ve takasi olcerek secebiliriz. + b) hicbir olcekte duzelmiyor -> tur gercekten basarisiz, kimlik verisi + ya karisima girmedi ya da 6.000 ornek 373.387 ornegin icinde eridi. + +Kiyas puani BURADA olculmuyor (pahali). Once kimlik duzeliyor mu ona bakilir; +duzeliyorsa o olcekte kiyas puani ayrica olculur. +""" +import os, sys, json, re, gc, torch, torch.nn as nn +os.environ["HF_DATASETS_OFFLINE"] = "1" +from transformers import AutoModelForCausalLM, AutoTokenizer + +MID = "/ari/users/ytanis/qwen3-32b" +CK = "/ari/users/ytanis/erk32b-sft2" +OUT = "/ari/users/ytanis/olcek_taramasi.json" +R, ALPHA = 256, 512 +OLCEKLER = [0.0, 0.40, 0.60, 0.80, 1.00] + +KIMLIK = [ + ("Seni kim gelistirdi?", ["eCloud"], ["Tongyi", "Alibaba"]), + ("Kimsin?", ["Erk"], ["Tongyi", "Alibaba"]), + ("Sen Qwen misin?", ["eCloud", "Erk"], []), + ("Temel modelin ne?", ["Qwen"], []), + ("Hangi sirket seni yapti?", ["eCloud"], ["Tongyi", "Alibaba"]), +] +HATA = [ + ("Kitapi masaya koydum.", True, "kitabi"), ("Kitabi masaya koydum.", False, None), + ("Agaca baktim.", False, None), ("Cocukun oyuncagi kayboldu.", True, "cocugun"), + ("Ekmeklar taze.", True, "ekmekler"), ("Ekmekler taze.", False, None), + ("Gozlar yorgun.", True, "gozler"), ("Gozler yorgun.", False, None), +] + +tok = AutoTokenizer.from_pretrained(MID) +model = AutoModelForCausalLM.from_pretrained(MID, torch_dtype=torch.bfloat16, + device_map="auto").eval() + +class LoRA(nn.Module): + OLCEK = 0.0 + def __init__(self, base): + super().__init__(); self.base = base + d = base.weight.device + self.A = nn.Parameter(torch.zeros(R, base.in_features, device=d, dtype=torch.bfloat16)) + self.B = nn.Parameter(torch.zeros(base.out_features, R, device=d, dtype=torch.bfloat16)) + self.s = ALPHA / R + def forward(self, x): + if LoRA.OLCEK == 0.0: return self.base(x) + return self.base(x) + ((x @ self.A.t()) @ self.B.t()) * (self.s * LoRA.OLCEK) + +for layer in model.model.layers: + for mod, adlar in ((layer.self_attn, ["q_proj","k_proj","v_proj","o_proj"]), + (layer.mlp, ["gate_proj","up_proj","down_proj"])): + for nm in adlar: setattr(mod, nm, LoRA(getattr(mod, nm))) +named = dict(model.named_parameters()) + +lsd = torch.load("%s/lora_ck.pt" % CK, map_location="cpu", weights_only=True) +esles = 0 +for k, v in lsd.items(): + if k in named: + with torch.no_grad(): named[k].copy_(v.to(named[k].device)) + esles += 1 +print("LoRA anahtar eslesme: %d / %d (checkpoint icinde %d)" % (esles, len(named), len(lsd)), flush=True) +if esles == 0: + print("HATA: hicbir agirlik yuklenmedi — sinav anlamsiz olurdu, duruyorum", flush=True) + sys.exit(1) +del lsd; gc.collect(); model.eval() + +def sor(istem, maks=300): + p = "<|im_start|>user\n%s /no_think<|im_end|>\n<|im_start|>assistant\n" % istem + ids = tok(p, return_tensors="pt", add_special_tokens=False).to(model.device) + with torch.no_grad(): + o = model.generate(**ids, max_new_tokens=maks, do_sample=False, pad_token_id=tok.eos_token_id) + r = tok.decode(o[0][ids.input_ids.shape[1]:], skip_special_tokens=True) + return r.split("",1)[1].strip() if "" in r else r.strip() + +son = {} +for ol in OLCEKLER: + LoRA.OLCEK = ol + print("\n" + "="*64 + "\n OLCEK %.2f%s\n" % (ol, " (= saf taban model)" if ol==0 else "") + "="*64, flush=True) + kd = 0 + for soru, olmali, olmamali in KIMLIK: + c = sor(soru, 220) + iyi = any(x.lower() in c.lower() for x in olmali) and not any(x.lower() in c.lower() for x in olmamali) + kd += iyi + print(" %s %-26s %s" % ("+" if iyi else "-", soru, c[:78].replace("\n"," ")), flush=True) + hd = 0 + for cumle, hatali, dogru in HATA: + c = sor("Su cumlede yazim hatasi var mi? Varsa duzelt:\n\n%s" % cumle, 260) + cl = c.lower() + dedi = bool(re.search(r"hata var|yanlis|duzelt|olmali|dogrusu", cl)) and \ + not re.search(r"hata yok|dogru yazil|hata bulunmuyor", cl) + hd += (dedi and dogru.lower() in cl) if hatali else (not dedi) + print("\n KIMLIK %d/%d HATA BULMA %d/%d" % (kd, len(KIMLIK), hd, len(HATA)), flush=True) + son["%.2f" % ol] = {"kimlik": kd, "hata": hd} + +print("\n" + "="*64) +print(" %-8s %-10s %s" % ("OLCEK", "KIMLIK", "HATA BULMA")) +for ol in OLCEKLER: + d = son["%.2f" % ol] + print(" %-8.2f %d/%-9d %d/%d" % (ol, d["kimlik"], len(KIMLIK), d["hata"], len(HATA))) +json.dump(son, open(OUT,"w"), ensure_ascii=False) +print("BITTI", flush=True) diff --git a/betikler/olcek_v2.py b/betikler/olcek_v2.py new file mode 100644 index 0000000000000000000000000000000000000000..ffaacd96ad54559f658ffddd42561b0748740060 --- /dev/null +++ b/betikler/olcek_v2.py @@ -0,0 +1,136 @@ +"""LoRA olcek taramasi — ince izgara, TOPLU uretim, guven araligiyla. + +Kaba tarama (0.0/0.3/0.5/0.7/1.0) sunu gosterdi: + - kiyas kazanci 0.30'da doyuyor (0.50'de ayni, sonra dusuyor) + - sohbet 0.30'da tepe yapiyor, sonra dusuyor +Ama sohbet testi n=329 ve %95 belirsizlik +-5.4 puan; tepe gurultu olabilir. + +Bu betik iki seyi duzeltir: + 1) HIZ: uretim toplu yapilir (sol dolgulu yigin) — nokta basina 2.5 saat + yerine dakikalar. Kaba tarama bu yuzden zaman sinirina takilmisti. + 2) KANIT: her ornegin sonucu kaydedilir, boylece noktalar arasi fark + eslestirilmis bootstrap ile sinanabilir. +""" +import os, json, re, gc, torch, torch.nn as nn +os.environ["HF_DATASETS_OFFLINE"] = "1" +from transformers import AutoModelForCausalLM, AutoTokenizer +from datasets import load_dataset + +MID = "/ari/users/ytanis/qwen3-32b" +SFT = "/ari/users/ytanis/erk32b-sft2" +OUT = "/ari/users/ytanis/olcek_v2.json" +R, ALPHA = 256, 512 +OLCEKLER = [0.0, 0.40, 0.75, 0.80, 0.85, 1.0] +YIGIN = 16 +MAKS_YENI = 640 + +morf = json.load(open("/ari/users/ytanis/turkmorfbench_v2.json", encoding="utf-8")) +ds = load_dataset("AYueksel/TurkishMMLU", "All", split="test") +letters = "ABCDE" +probe = set(list(range(1, min(900, len(ds)), 6))[:150]) +held = [i for i in range(min(900, len(ds))) if i not in probe] +KIR = set(json.load(open("/ari/users/ytanis/kirlilik_CPT.json"))["kirli_13"]) +temiz = [i for i in held if i not in KIR] + +tok = AutoTokenizer.from_pretrained(MID) +tok.padding_side = "left" # toplu uretim icin sart +if tok.pad_token is None: + tok.pad_token = tok.eos_token +lid = [tok(" " + c, add_special_tokens=False).input_ids[-1] for c in letters] +model = AutoModelForCausalLM.from_pretrained(MID, torch_dtype=torch.bfloat16, + device_map="auto").eval() + + +class LoRA(nn.Module): + OLCEK = 1.0 + + def __init__(self, base, r=R, alpha=ALPHA): + super().__init__(); self.base = base + d = base.weight.device + self.A = nn.Parameter(torch.zeros(r, base.in_features, device=d, dtype=torch.bfloat16)) + self.B = nn.Parameter(torch.zeros(base.out_features, r, device=d, dtype=torch.bfloat16)) + self.s = alpha / r + + def forward(self, x): + if LoRA.OLCEK == 0.0: + return self.base(x) + return self.base(x) + ((x @ self.A.t()) @ self.B.t()) * (self.s * LoRA.OLCEK) + + +for layer in model.model.layers: + for mod, names in ((layer.self_attn, ["q_proj", "k_proj", "v_proj", "o_proj"]), + (layer.mlp, ["gate_proj", "up_proj", "down_proj"])): + for nm in names: setattr(mod, nm, LoRA(getattr(mod, nm))) +named = dict(model.named_parameters()) +lsd = torch.load("%s/lora_ck.pt" % SFT, map_location="cpu", weights_only=True) +for k, v in lsd.items(): + if k in named: + with torch.no_grad(): named[k].copy_(v.to(named[k].device)) +del lsd; gc.collect(); model.eval() +print("hazir | yigin=%d | %d olcek" % (YIGIN, len(OLCEKLER)), flush=True) + +ISTEM = ["<|im_start|>user\n%s<|im_end|>\n<|im_start|>assistant\n" % x["soru"] for x in morf] +ALTIN = [re.sub(r"[.,!?;:\"'()\[\]*`]", "", x["cevap"].strip().lower()) for x in morf] + + +def sil(s): + return re.sub(r"[.,!?;:\"'()\[\]*`]", "", s.strip().lower()) + + +def sohbet_olc(): + vec = []; kesik = 0 + with torch.no_grad(): + for b in range(0, len(ISTEM), YIGIN): + grup = ISTEM[b:b + YIGIN] + enc = tok(grup, return_tensors="pt", padding=True, + add_special_tokens=False).to(model.device) + out = model.generate(**enc, max_new_tokens=MAKS_YENI, do_sample=False, + pad_token_id=tok.pad_token_id) + for j in range(len(grup)): + u = out[j][enc.input_ids.shape[1]:] + raw = tok.decode(u, skip_special_tokens=True) + if len(u) >= MAKS_YENI: kesik += 1 + c = raw.split("", 1)[1] if "" in raw else ("" if "" in raw else raw) + g = ALTIN[b + j] + vec.append(int(bool(re.search(r"(?:^|\W)%s(?:\W|$)" % re.escape(g), sil(c))))) + return vec, kesik + + +def mmlu_olc(): + vec = [] + with torch.no_grad(): + for i in temiz: + ex = ds[i] + try: + a = ex["answer"] + ans = int(a) if isinstance(a, int) else letters.index(str(a).strip()) + except Exception: + vec.append(None); continue + ch = list(ex["choices"])[:5]; k = len(ch) + ch = ch[-1:] + ch[:-1]; ans = (ans + 1) % k + s = "Asagidaki coktan secmeli soruyu cevapla.\n\nSoru: " + str(ex["question"]) + "\n" + for j, c in enumerate(ch): s += "%s) %s\n" % (letters[j], c) + iid = tok(s + "Cevap:", return_tensors="pt", truncation=True, + max_length=1024).input_ids.to(model.device) + lg = model(iid).logits[0, -1] + vec.append(int(int(torch.stack([lg[t] for t in lid[:k]]).argmax()) == ans)) + return vec + + +son = {} +print("\n%-8s %10s %13s %8s" % ("olcek", "sohbet", "TurkishMMLU", "kesik"), flush=True) +print("-" * 44, flush=True) +for o in OLCEKLER: + LoRA.OLCEK = o + sv, kesik = sohbet_olc() + mv = mmlu_olc() + sz = [x for x in sv if x is not None]; mz = [x for x in mv if x is not None] + son["%.2f" % o] = {"sohbet_vec": sv, "mmlu_vec": mv, "kesik": kesik, + "sohbet": 100.0 * sum(sz) / len(sz), + "mmlu": 100.0 * sum(mz) / len(mz)} + print("%-8.2f %9.2f%% %12.2f%% %8d" + % (o, son["%.2f" % o]["sohbet"], son["%.2f" % o]["mmlu"], kesik), flush=True) + json.dump(son, open(OUT, "w")) # her adimda kaydet (zaman siniri emniyeti) + +print("\n-> %s" % OUT, flush=True) +print("BITTI", flush=True) diff --git a/betikler/permutasyon_testi.py b/betikler/permutasyon_testi.py new file mode 100644 index 0000000000000000000000000000000000000000..db39ba47cc8d1bcabfe6ea687a17d126a5b9833c --- /dev/null +++ b/betikler/permutasyon_testi.py @@ -0,0 +1,105 @@ +"""Sik-sirasi saglamlik testi: kazanc harf onyargisi mi, gercek bilgi mi? + +Coktan secmeli log-olabilirlik olcumunun bilinen zayifligi, modelin +secenek HARFINE dair bir onsel ogrenmesidir. Siklar dondurulup dogru +cevabin harfi degistirildiginde sahte kazanc yok olur, gercek kazanc kalir. + +Ayni GPU'da iki olcum: once stok taban, sonra ayni tabana LoRA takilarak +Erk-32B. Boylece taban bir kez yuklenir ve iki model birebir ayni kosulda +olculur. + +Cikti: her model icin ORIJINAL ve DONDURULMUS sira altinda held-out 750. +""" +import os, json, torch, torch.nn as nn +os.environ["HF_DATASETS_OFFLINE"] = "1" +from transformers import AutoModelForCausalLM, AutoTokenizer +from datasets import load_dataset + +MID = "/ari/users/ytanis/qwen3-32b" +CPT = "/ari/users/ytanis/erk32b-cpt" +OUT = "/ari/users/ytanis/permutasyon_testi.json" +R, ALPHA = 256, 512 + +tok = AutoTokenizer.from_pretrained(MID) +model = AutoModelForCausalLM.from_pretrained(MID, torch_dtype=torch.bfloat16, + device_map="auto").eval() +ds = load_dataset("AYueksel/TurkishMMLU", "All", split="test") +letters = "ABCDE" +lid = [tok(" " + c, add_special_tokens=False).input_ids[-1] for c in letters] +probe = set(list(range(1, min(900, len(ds)), 6))[:150]) +held = [i for i in range(min(900, len(ds))) if i not in probe] + + +def olc(kaydir): + """kaydir=0: orijinal sira. kaydir=1: siklar bir basamak dondurulur.""" + vec = [] + with torch.no_grad(): + for i in held: + ex = ds[i] + try: + a = ex["answer"] + ans = int(a) if isinstance(a, int) else letters.index(str(a).strip()) + except Exception: + vec.append(None); continue + ch = list(ex["choices"])[:5] + k = len(ch) + if kaydir: + ch = ch[-kaydir:] + ch[:-kaydir] # dairesel kaydirma + ans = (ans + kaydir) % k # dogru cevap yeni yerine tasinir + s = "Asagidaki coktan secmeli soruyu cevapla.\n\nSoru: " + str(ex["question"]) + "\n" + for j, c in enumerate(ch): + s += "%s) %s\n" % (letters[j], c) + ids = tok(s + "Cevap:", return_tensors="pt", truncation=True, + max_length=1024).input_ids.to(model.device) + lg = model(ids).logits[0, -1] + vec.append(int(int(torch.stack([lg[t] for t in lid[:k]]).argmax()) == ans)) + z = [x for x in vec if x is not None] + return 100.0 * sum(z) / len(z), vec + + +son = {} +for ad, kay in (("orijinal", 0), ("dondurulmus", 1)): + acc, vec = olc(kay) + son["stok_" + ad] = {"acc": acc, "vec": vec} + print("stok Qwen3-32B [%-12s] %%%.2f" % (ad, acc), flush=True) + + +class LoRA(nn.Module): + def __init__(self, base, r=R, alpha=ALPHA): + super().__init__(); self.base = base + d = base.weight.device + self.A = nn.Parameter(torch.zeros(r, base.in_features, device=d, dtype=torch.bfloat16)) + self.B = nn.Parameter(torch.zeros(base.out_features, r, device=d, dtype=torch.bfloat16)) + self.s = alpha / r + + def forward(self, x): + return self.base(x) + ((x @ self.A.t()) @ self.B.t()) * self.s + + +for layer in model.model.layers: + for mod, names in ((layer.self_attn, ["q_proj", "k_proj", "v_proj", "o_proj"]), + (layer.mlp, ["gate_proj", "up_proj", "down_proj"])): + for nm in names: setattr(mod, nm, LoRA(getattr(mod, nm))) +st = json.load(open(f"{CPT}/state.json")) +lsd = torch.load(f"{CPT}/lora_ck.pt", map_location="cpu", weights_only=True) +named = dict(model.named_parameters()); n = 0 +for k, v in lsd.items(): + if k in named: + with torch.no_grad(): named[k].copy_(v.to(named[k].device)) + n += 1 +print("\nLoRA yuklendi: %d tensor | adim %d (%.2fB token)\n" % (n, st["step"], st["tokens"] / 1e9), flush=True) +model.eval() + +for ad, kay in (("orijinal", 0), ("dondurulmus", 1)): + acc, vec = olc(kay) + son["erk_" + ad] = {"acc": acc, "vec": vec} + print("Erk-32B (ara) [%-12s] %%%.2f" % (ad, acc), flush=True) + +print("\n=== KAZANC ===") +for ad in ("orijinal", "dondurulmus"): + d = son["erk_" + ad]["acc"] - son["stok_" + ad]["acc"] + print(" %-12s fark: %+.2f puan" % (ad, d)) +son["step"] = st["step"] +json.dump(son, open(OUT, "w")) +print("-> %s" % OUT) +print("BITTI", flush=True) diff --git a/betikler/sablon_yama.py b/betikler/sablon_yama.py new file mode 100644 index 0000000000000000000000000000000000000000..7d359527239e58d95e7294cc4591119d6a6d8664 --- /dev/null +++ b/betikler/sablon_yama.py @@ -0,0 +1,73 @@ +"""Sohbet sablonuna VARSAYILAN kimlik sistem istemi ekle. + +NEDEN: kimlik agirliklarda 0,80 olceginde 12/30, sistem istemiyle 30/30. Istemi +kullaniciya birakirsak GGUF/ollama/transformers kullanicilarinin cogu koymaz ve +model taban modelin kimligini soyler. Sablon degisikligi bunu her dagitim +yolunda cozer: kullanici sistem mesaji vermezse varsayilan girer, verirse +kullanicininki gecerli olur (varsayilan EKLENMEZ, ustune yazilmaz). + +Kullanim: python sablon_yama.py +Birlestirme her tekrarlandiginda YENIDEN kosulmali: birlestir.py sablonu tabandan +kopyalar. Betik kendi degisikligini taniyip ikinci kez uygulamaz. +""" +import os, sys, json + +DIZIN = sys.argv[1] if len(sys.argv) > 1 else "/ari/users/ytanis/erk32b-birlesik-080" +SISTEM = ("Sen Erk-32B'sin: eCloud Tech. tarafından, açık kaynaklı Qwen3-32B temel " + "modeli üzerine Türkçe devam-eğitimi ve talimat ayarıyla geliştirilmiş 32 " + "milyar parametreli bir Türkçe dil modelisin. Kimliğin, seni kimin " + "geliştirdiği ya da temel modelin sorulduğunda bunu açıkça söyle; başka " + "bir şirketin modeli olduğunu asla iddia etme.") +ISARET = "{#- erk-varsayilan-sistem -#}" + +yol = os.path.join(DIZIN, "chat_template.jinja") +s = open(yol, encoding="utf-8").read() +if ISARET in s: + print("sablon zaten yamali, dokunulmadi"); sys.exit(0) +open(yol + ".taban", "w", encoding="utf-8").write(s) + +# Jinja icinde tek tirnakli dize: istemde tek tirnak var ("Erk-32B'sin") -> kacir +j = SISTEM.replace("\\", "\\\\").replace("'", "\\'") + +# (a) araclarla cagri dali: sistem mesaji yoksa varsayilani "# Tools"tan once koy +eski_a = (" {%- if messages[0].role == 'system' %}\n" + " {{- messages[0].content + '\\n\\n' }}\n" + " {%- endif %}\n") +yeni_a = (" {%- if messages[0].role == 'system' %}\n" + " {{- messages[0].content + '\\n\\n' }}\n" + " {%- else %}\n" + " {{- '" + j + "' + '\\n\\n' }}\n" + " {%- endif %}\n") +# (b) normal dal +eski_b = (" {%- if messages[0].role == 'system' %}\n" + " {{- '<|im_start|>system\\n' + messages[0].content + '<|im_end|>\\n' }}\n" + " {%- endif %}\n") +yeni_b = (" {%- if messages[0].role == 'system' %}\n" + " {{- '<|im_start|>system\\n' + messages[0].content + '<|im_end|>\\n' }}\n" + " {%- else %}\n" + " {{- '<|im_start|>system\\n' + '" + j + "' + '<|im_end|>\\n' }}\n" + " {%- endif %}\n") +for e, y, ad in ((eski_a, yeni_a, "arac dali"), (eski_b, yeni_b, "normal dal")): + assert s.count(e) == 1, "%s: hedef blok tam bir kez bulunmali (bulunan: %d)" % (ad, s.count(e)) + s = s.replace(e, y) +s = ISARET + "\n" + s +open(yol, "w", encoding="utf-8").write(s) + +# tokenizer_config.json icindeki kopya da guncellenmeli (transformers oradan okur) +tc = os.path.join(DIZIN, "tokenizer_config.json") +if os.path.exists(tc): + d = json.load(open(tc, encoding="utf-8")) + if "chat_template" in d: + d["chat_template"] = s + json.dump(d, open(tc, "w", encoding="utf-8"), ensure_ascii=False, indent=2) + print("tokenizer_config.json chat_template guncellendi") + +# dogrulama: sistem mesaji yoksa varsayilan girer, varsa girmez +from transformers import AutoTokenizer +tok = AutoTokenizer.from_pretrained(DIZIN) +a = tok.apply_chat_template([{"role": "user", "content": "Kimsin?"}], tokenize=False, add_generation_prompt=True) +b = tok.apply_chat_template([{"role": "system", "content": "Sen bir çevirmensin."}, + {"role": "user", "content": "Kimsin?"}], tokenize=False, add_generation_prompt=True) +assert "Erk-32B" in a and a.count("<|im_start|>system") == 1, "varsayilan girmedi" +assert "Erk-32B" not in b and "çevirmensin" in b and b.count("<|im_start|>system") == 1, "kullanici istemi ezildi" +print("sablon yamalandi ve dogrulandi: varsayilan girer / kullanici istemi korunur") diff --git a/betikler/sft32b_ek.py b/betikler/sft32b_ek.py new file mode 100644 index 0000000000000000000000000000000000000000..2a9ba68ca0f09bfa8a830cc03fbcd27a77eccdd4 --- /dev/null +++ b/betikler/sft32b_ek.py @@ -0,0 +1,190 @@ +"""Erk-32B SFT — FSDP LoRA, CPT checkpoint'i uzerine, kaldigi yerden devam. + +CPT iskeletinin aynisi; farklar: + - veri paketlenmis (ids, labels); kayip yalnizca asistan iceriginde + - LR dusuk (2e-5) ve sonda ~0'a iner + - ilk baslatmada LoRA agirliklari CPT checkpoint'inden ISIKLENIR + (OUT_SFT bos ise); sonraki parcalar kendi checkpoint'inden devam eder + +Kullanim: torchrun --nproc_per_node=4 sft32b_train.py +""" +import os, sys, time, math, json, functools, torch, torch.nn as nn, torch.distributed as dist +from torch.distributed.fsdp import FullyShardedDataParallel as FSDP, MixedPrecision, StateDictType +from torch.distributed.fsdp import FullStateDictConfig +from torch.distributed.fsdp.wrap import transformer_auto_wrap_policy +from transformers import AutoModelForCausalLM, AutoTokenizer +from transformers.models.qwen3.modeling_qwen3 import Qwen3DecoderLayer +os.environ["HF_DATASETS_OFFLINE"] = "1" + +dist.init_process_group("nccl") +rank = dist.get_rank(); local = int(os.environ["LOCAL_RANK"]); W = dist.get_world_size() +torch.cuda.set_device(local) + +MID = "/ari/users/ytanis/qwen3-32b" +CPT = "/ari/users/ytanis/erk32b-sft" # ek tur: mevcut SFT ciktisindan baslar +OUT = "/ari/users/ytanis/erk32b-sft2" +SEQ = 2048; BS = 4; R = 256; ALPHA = 512; LR = 1e-5; WARMUP = 100 +EPOCHS = 1 +BUDGET_MIN = float(sys.argv[1]) if len(sys.argv) > 1 else 1380 +PROBE_EVERY = 1000; SAVE_EVERY = 250 +if BUDGET_MIN < 20: PROBE_EVERY = 40; SAVE_EVERY = 60 # duman: tum gecis yollarini dene +os.makedirs(OUT, exist_ok=True) + +tok = AutoTokenizer.from_pretrained(MID) +model = AutoModelForCausalLM.from_pretrained(MID, torch_dtype=torch.bfloat16) +model.gradient_checkpointing_enable(gradient_checkpointing_kwargs={"use_reentrant": False}) +model.enable_input_require_grads() +for p in model.parameters(): p.requires_grad = False + + +class LoRA(nn.Module): + def __init__(self, base, r=R, alpha=ALPHA): + super().__init__(); self.base = base + self.A = nn.Parameter(torch.zeros(r, base.in_features, dtype=torch.bfloat16)) + self.B = nn.Parameter(torch.zeros(base.out_features, r, dtype=torch.bfloat16)) + nn.init.kaiming_uniform_(self.A, a=math.sqrt(5)); self.s = alpha / r + + def forward(self, x): + return self.base(x) + ((x @ self.A.t()) @ self.B.t()) * self.s + + +for layer in model.model.layers: + for mod, names in ((layer.self_attn, ["q_proj", "k_proj", "v_proj", "o_proj"]), + (layer.mlp, ["gate_proj", "up_proj", "down_proj"])): + for nm in names: setattr(mod, nm, LoRA(getattr(mod, nm))) + +# --- durum: LoRA-only checkpoint (FSDP wrap'ten ONCE yuklenir) --- +state = {"step": 0, "tokens": 0, "best_dev": 0.0} +sf = f"{OUT}/state.json"; LCK = f"{OUT}/lora_ck.pt" +RESUME_AT = 0 +if os.path.exists(sf) and os.path.exists(LCK): + kaynak, state = LCK, json.load(open(sf)); RESUME_AT = state["step"] + aciklama = f"SFT DEVAM: adim {state['step']}" +else: + kaynak = f"{CPT}/lora_ck.pt" # ilk baslatma: CPT'den isikle + assert os.path.exists(kaynak), "CPT checkpoint yok: %s" % kaynak + _c = json.load(open(f"{CPT}/state.json")) + aciklama = f"CPT'den isiklendi (CPT adim {_c['step']}, {_c['tokens'] / 1e9:.2f}B token)" +lsd = torch.load(kaynak, map_location="cpu", weights_only=True) +named = dict(model.named_parameters()); n = 0 +for k, v in lsd.items(): + if k in named: + with torch.no_grad(): named[k].copy_(v) + n += 1 +del lsd +if rank == 0: print(f"{aciklama} — {n} LoRA tensoru yuklendi", flush=True) + +policy = functools.partial(transformer_auto_wrap_policy, transformer_layer_cls={Qwen3DecoderLayer}) +model = FSDP(model, auto_wrap_policy=policy, device_id=local, + mixed_precision=MixedPrecision(param_dtype=torch.bfloat16, reduce_dtype=torch.bfloat16), + use_orig_params=True) +params = [p for p in model.parameters() if p.requires_grad] +opt = torch.optim.AdamW(params, lr=LR, betas=(0.9, 0.95), weight_decay=0.0) + +_fcfg = FullStateDictConfig(offload_to_cpu=True, rank0_only=True) + + +def save_ck(): + with FSDP.state_dict_type(model, StateDictType.FULL_STATE_DICT, _fcfg): + sd = model.state_dict() + if rank == 0: + lora = {k: v for k, v in sd.items() if k.endswith(".A") or k.endswith(".B")} + torch.save(lora, LCK + ".tmp") + # Uzerine yazmadan ONCE bir oncekini sakla — tek dosyaya yazmak, kotu + # giden bir kosuda geri donulecek nokta birakmiyor (CPT'de yasandi). + if os.path.exists(LCK): + os.replace(LCK, LCK + ".onceki") + if os.path.exists(sf): os.replace(sf, sf + ".onceki") + os.replace(LCK + ".tmp", LCK) + json.dump(state, open(sf, "w")) + del sd; dist.barrier() + + +# --- veri: onceden paketlenmis diziler (is icinde tokenizasyon YOK) --- +CACHE = f"{OUT}/sft_tokens.pt" +assert os.path.exists(CACHE), "sft_tokens.pt yok - once sft32b_pretok.py kos" +_d = torch.load(CACHE, map_location="cpu") +IDS, LAB = _d["ids"], _d["labels"] +NSEQ = IDS.shape[0] +STEP_SEQ = BS * W +TOTAL_STEPS = (NSEQ * EPOCHS) // STEP_SEQ +STEP_TOKENS = SEQ * STEP_SEQ +if rank == 0: + print(f"korpus: {NSEQ} dizi x {SEQ} = {NSEQ * SEQ / 1e6:.0f}M token | " + f"{EPOCHS} tur -> {TOTAL_STEPS} adim | bu parca {BUDGET_MIN:.0f} dk", flush=True) + + +def lr_at(s): + if s < WARMUP: base = LR * (s + 1) / WARMUP + else: + pr = min(1.0, (s - WARMUP) / max(TOTAL_STEPS - WARMUP, 1)) + base = LR * (0.02 + 0.49 * (1 + math.cos(math.pi * pr))) + if RESUME_AT > 0 and s - RESUME_AT < 50: # parca gecisi: momentler sifir + base *= max(0.1, (s - RESUME_AT + 1) / 50) + return base + + +# --- probe: CPT ile AYNI dev-150 (karsilastirilabilirlik icin bicim degismez) --- +# FSDP notu: her forward kolektiftir -> TUM ranklar AYNI sorulari ayni sirayla isler. +from datasets import load_dataset +_full = load_dataset("AYueksel/TurkishMMLU", "All", split="test") +_pidx = list(range(1, len(_full), 6))[:150] +dev = _full.select(_pidx) +letters = "ABCDE"; lid = [tok(" " + c, add_special_tokens=False).input_ids[-1] for c in letters] + + +def dev_probe(): + model.eval(); cor = 0; tot = 0 + with torch.no_grad(): + for i in range(len(dev)): + ex = dev[i] + a = ex["answer"] + ans = int(a) if isinstance(a, int) else (letters.index(str(a).strip()) if str(a).strip() in letters else int(a)) + ch = list(ex["choices"]); s = "Asagidaki coktan secmeli soruyu cevapla.\n\nSoru: " + str(ex["question"]) + "\n" + for j, c in enumerate(ch[:5]): s += f"{letters[j]}) {c}\n" + ids = tok(s + "Cevap:", return_tensors="pt", truncation=True, max_length=1024).input_ids.to(local) + lg = model(ids).logits[0, -1] + cor += int(int(torch.stack([lg[t] for t in lid]).argmax()) == ans); tot += 1 + model.train() + return 100 * cor / max(tot, 1) + + +t_start = time.time(); t_last = t_start; run = 0.0; nacc = 0 +model.train() +# NOT: adim-0 probe bilerek YOK — ilk forward eval olursa egitime geciste kilitlenir (olculdu). +while state["step"] < TOTAL_STEPS: + s = state["step"] + idx = [((s * W + rank) * BS + b) % NSEQ for b in range(BS)] + ids = IDS[idx].to(torch.long).to(local) + lab = LAB[idx].to(torch.long).to(local) + out = model(input_ids=ids, labels=lab) + out.loss.backward() + for g in opt.param_groups: g["lr"] = lr_at(s) + model.clip_grad_norm_(1.0) + opt.step(); opt.zero_grad() + run += out.loss.item(); nacc += 1; state["step"] += 1; state["tokens"] += STEP_TOKENS + if state["step"] % 100 == 0 and rank == 0: + # nacc ile bol, 100 ile degil: devam sonrasi ilk satirda yalnizca + # birkac adim birikmis olur ve sabit 100 bolmesi kaybi ~30 kat dusuk, + # tok/s'yi ~30 kat yuksek gosterip sahte alarm uretir. + el = (time.time() - t_start) / 60 + tps = STEP_TOKENS * nacc / max(time.time() - t_last, 1e-9); t_last = time.time() + print(f"adim {state['step']}/{TOTAL_STEPS} kayip {run / max(nacc, 1):.4f} lr {lr_at(s):.2e} " + f"{tps:.0f}tok/s {el:.0f}dk", flush=True) + run = 0.0; nacc = 0 + if state["step"] % SAVE_EVERY == 0: + save_ck() + if state["step"] % PROBE_EVERY == 0: + p = dev_probe() + if rank == 0: + print(f" PROBE adim {state['step']}: DEV %{p:.1f}", flush=True) + if p > state["best_dev"]: state["best_dev"] = p + # SURE KONTROLU KOLEKTIF: yerel saat farki rank'lari farkli adimda durdurur -> NCCL kilidi + _stop = torch.tensor([1.0 if (time.time() - t_start) / 60 > BUDGET_MIN else 0.0], device=local) + dist.all_reduce(_stop, op=dist.ReduceOp.MAX) + if _stop.item() > 0: + if rank == 0: print(f"SURE DOLDU ({BUDGET_MIN:.0f}dk) — checkpoint alinip cikiliyor", flush=True) + break +save_ck() +if rank == 0: print(f"PARCA BITTI: adim {state['step']}/{TOTAL_STEPS}", flush=True) +dist.destroy_process_group() diff --git a/betikler/sft32b_train.py b/betikler/sft32b_train.py new file mode 100644 index 0000000000000000000000000000000000000000..11a7d3089af765536eff4cff5b80c7718461fbda --- /dev/null +++ b/betikler/sft32b_train.py @@ -0,0 +1,190 @@ +"""Erk-32B SFT — FSDP LoRA, CPT checkpoint'i uzerine, kaldigi yerden devam. + +CPT iskeletinin aynisi; farklar: + - veri paketlenmis (ids, labels); kayip yalnizca asistan iceriginde + - LR dusuk (2e-5) ve sonda ~0'a iner + - ilk baslatmada LoRA agirliklari CPT checkpoint'inden ISIKLENIR + (OUT_SFT bos ise); sonraki parcalar kendi checkpoint'inden devam eder + +Kullanim: torchrun --nproc_per_node=4 sft32b_train.py +""" +import os, sys, time, math, json, functools, torch, torch.nn as nn, torch.distributed as dist +from torch.distributed.fsdp import FullyShardedDataParallel as FSDP, MixedPrecision, StateDictType +from torch.distributed.fsdp import FullStateDictConfig +from torch.distributed.fsdp.wrap import transformer_auto_wrap_policy +from transformers import AutoModelForCausalLM, AutoTokenizer +from transformers.models.qwen3.modeling_qwen3 import Qwen3DecoderLayer +os.environ["HF_DATASETS_OFFLINE"] = "1" + +dist.init_process_group("nccl") +rank = dist.get_rank(); local = int(os.environ["LOCAL_RANK"]); W = dist.get_world_size() +torch.cuda.set_device(local) + +MID = "/ari/users/ytanis/qwen3-32b" +CPT = "/ari/users/ytanis/erk32b-cpt" +OUT = "/ari/users/ytanis/erk32b-sft" +SEQ = 2048; BS = 4; R = 256; ALPHA = 512; LR = 2e-5; WARMUP = 100 +EPOCHS = 2 +BUDGET_MIN = float(sys.argv[1]) if len(sys.argv) > 1 else 1380 +PROBE_EVERY = 1000; SAVE_EVERY = 250 +if BUDGET_MIN < 20: PROBE_EVERY = 40; SAVE_EVERY = 60 # duman: tum gecis yollarini dene +os.makedirs(OUT, exist_ok=True) + +tok = AutoTokenizer.from_pretrained(MID) +model = AutoModelForCausalLM.from_pretrained(MID, torch_dtype=torch.bfloat16) +model.gradient_checkpointing_enable(gradient_checkpointing_kwargs={"use_reentrant": False}) +model.enable_input_require_grads() +for p in model.parameters(): p.requires_grad = False + + +class LoRA(nn.Module): + def __init__(self, base, r=R, alpha=ALPHA): + super().__init__(); self.base = base + self.A = nn.Parameter(torch.zeros(r, base.in_features, dtype=torch.bfloat16)) + self.B = nn.Parameter(torch.zeros(base.out_features, r, dtype=torch.bfloat16)) + nn.init.kaiming_uniform_(self.A, a=math.sqrt(5)); self.s = alpha / r + + def forward(self, x): + return self.base(x) + ((x @ self.A.t()) @ self.B.t()) * self.s + + +for layer in model.model.layers: + for mod, names in ((layer.self_attn, ["q_proj", "k_proj", "v_proj", "o_proj"]), + (layer.mlp, ["gate_proj", "up_proj", "down_proj"])): + for nm in names: setattr(mod, nm, LoRA(getattr(mod, nm))) + +# --- durum: LoRA-only checkpoint (FSDP wrap'ten ONCE yuklenir) --- +state = {"step": 0, "tokens": 0, "best_dev": 0.0} +sf = f"{OUT}/state.json"; LCK = f"{OUT}/lora_ck.pt" +RESUME_AT = 0 +if os.path.exists(sf) and os.path.exists(LCK): + kaynak, state = LCK, json.load(open(sf)); RESUME_AT = state["step"] + aciklama = f"SFT DEVAM: adim {state['step']}" +else: + kaynak = f"{CPT}/lora_ck.pt" # ilk baslatma: CPT'den isikle + assert os.path.exists(kaynak), "CPT checkpoint yok: %s" % kaynak + _c = json.load(open(f"{CPT}/state.json")) + aciklama = f"CPT'den isiklendi (CPT adim {_c['step']}, {_c['tokens'] / 1e9:.2f}B token)" +lsd = torch.load(kaynak, map_location="cpu", weights_only=True) +named = dict(model.named_parameters()); n = 0 +for k, v in lsd.items(): + if k in named: + with torch.no_grad(): named[k].copy_(v) + n += 1 +del lsd +if rank == 0: print(f"{aciklama} — {n} LoRA tensoru yuklendi", flush=True) + +policy = functools.partial(transformer_auto_wrap_policy, transformer_layer_cls={Qwen3DecoderLayer}) +model = FSDP(model, auto_wrap_policy=policy, device_id=local, + mixed_precision=MixedPrecision(param_dtype=torch.bfloat16, reduce_dtype=torch.bfloat16), + use_orig_params=True) +params = [p for p in model.parameters() if p.requires_grad] +opt = torch.optim.AdamW(params, lr=LR, betas=(0.9, 0.95), weight_decay=0.0) + +_fcfg = FullStateDictConfig(offload_to_cpu=True, rank0_only=True) + + +def save_ck(): + with FSDP.state_dict_type(model, StateDictType.FULL_STATE_DICT, _fcfg): + sd = model.state_dict() + if rank == 0: + lora = {k: v for k, v in sd.items() if k.endswith(".A") or k.endswith(".B")} + torch.save(lora, LCK + ".tmp") + # Uzerine yazmadan ONCE bir oncekini sakla — tek dosyaya yazmak, kotu + # giden bir kosuda geri donulecek nokta birakmiyor (CPT'de yasandi). + if os.path.exists(LCK): + os.replace(LCK, LCK + ".onceki") + if os.path.exists(sf): os.replace(sf, sf + ".onceki") + os.replace(LCK + ".tmp", LCK) + json.dump(state, open(sf, "w")) + del sd; dist.barrier() + + +# --- veri: onceden paketlenmis diziler (is icinde tokenizasyon YOK) --- +CACHE = f"{OUT}/sft_tokens.pt" +assert os.path.exists(CACHE), "sft_tokens.pt yok - once sft32b_pretok.py kos" +_d = torch.load(CACHE, map_location="cpu") +IDS, LAB = _d["ids"], _d["labels"] +NSEQ = IDS.shape[0] +STEP_SEQ = BS * W +TOTAL_STEPS = (NSEQ * EPOCHS) // STEP_SEQ +STEP_TOKENS = SEQ * STEP_SEQ +if rank == 0: + print(f"korpus: {NSEQ} dizi x {SEQ} = {NSEQ * SEQ / 1e6:.0f}M token | " + f"{EPOCHS} tur -> {TOTAL_STEPS} adim | bu parca {BUDGET_MIN:.0f} dk", flush=True) + + +def lr_at(s): + if s < WARMUP: base = LR * (s + 1) / WARMUP + else: + pr = min(1.0, (s - WARMUP) / max(TOTAL_STEPS - WARMUP, 1)) + base = LR * (0.02 + 0.49 * (1 + math.cos(math.pi * pr))) + if RESUME_AT > 0 and s - RESUME_AT < 50: # parca gecisi: momentler sifir + base *= max(0.1, (s - RESUME_AT + 1) / 50) + return base + + +# --- probe: CPT ile AYNI dev-150 (karsilastirilabilirlik icin bicim degismez) --- +# FSDP notu: her forward kolektiftir -> TUM ranklar AYNI sorulari ayni sirayla isler. +from datasets import load_dataset +_full = load_dataset("AYueksel/TurkishMMLU", "All", split="test") +_pidx = list(range(1, len(_full), 6))[:150] +dev = _full.select(_pidx) +letters = "ABCDE"; lid = [tok(" " + c, add_special_tokens=False).input_ids[-1] for c in letters] + + +def dev_probe(): + model.eval(); cor = 0; tot = 0 + with torch.no_grad(): + for i in range(len(dev)): + ex = dev[i] + a = ex["answer"] + ans = int(a) if isinstance(a, int) else (letters.index(str(a).strip()) if str(a).strip() in letters else int(a)) + ch = list(ex["choices"]); s = "Asagidaki coktan secmeli soruyu cevapla.\n\nSoru: " + str(ex["question"]) + "\n" + for j, c in enumerate(ch[:5]): s += f"{letters[j]}) {c}\n" + ids = tok(s + "Cevap:", return_tensors="pt", truncation=True, max_length=1024).input_ids.to(local) + lg = model(ids).logits[0, -1] + cor += int(int(torch.stack([lg[t] for t in lid]).argmax()) == ans); tot += 1 + model.train() + return 100 * cor / max(tot, 1) + + +t_start = time.time(); t_last = t_start; run = 0.0; nacc = 0 +model.train() +# NOT: adim-0 probe bilerek YOK — ilk forward eval olursa egitime geciste kilitlenir (olculdu). +while state["step"] < TOTAL_STEPS: + s = state["step"] + idx = [((s * W + rank) * BS + b) % NSEQ for b in range(BS)] + ids = IDS[idx].to(torch.long).to(local) + lab = LAB[idx].to(torch.long).to(local) + out = model(input_ids=ids, labels=lab) + out.loss.backward() + for g in opt.param_groups: g["lr"] = lr_at(s) + model.clip_grad_norm_(1.0) + opt.step(); opt.zero_grad() + run += out.loss.item(); nacc += 1; state["step"] += 1; state["tokens"] += STEP_TOKENS + if state["step"] % 100 == 0 and rank == 0: + # nacc ile bol, 100 ile degil: devam sonrasi ilk satirda yalnizca + # birkac adim birikmis olur ve sabit 100 bolmesi kaybi ~30 kat dusuk, + # tok/s'yi ~30 kat yuksek gosterip sahte alarm uretir. + el = (time.time() - t_start) / 60 + tps = STEP_TOKENS * nacc / max(time.time() - t_last, 1e-9); t_last = time.time() + print(f"adim {state['step']}/{TOTAL_STEPS} kayip {run / max(nacc, 1):.4f} lr {lr_at(s):.2e} " + f"{tps:.0f}tok/s {el:.0f}dk", flush=True) + run = 0.0; nacc = 0 + if state["step"] % SAVE_EVERY == 0: + save_ck() + if state["step"] % PROBE_EVERY == 0: + p = dev_probe() + if rank == 0: + print(f" PROBE adim {state['step']}: DEV %{p:.1f}", flush=True) + if p > state["best_dev"]: state["best_dev"] = p + # SURE KONTROLU KOLEKTIF: yerel saat farki rank'lari farkli adimda durdurur -> NCCL kilidi + _stop = torch.tensor([1.0 if (time.time() - t_start) / 60 > BUDGET_MIN else 0.0], device=local) + dist.all_reduce(_stop, op=dist.ReduceOp.MAX) + if _stop.item() > 0: + if rank == 0: print(f"SURE DOLDU ({BUDGET_MIN:.0f}dk) — checkpoint alinip cikiliyor", flush=True) + break +save_ck() +if rank == 0: print(f"PARCA BITTI: adim {state['step']}/{TOTAL_STEPS}", flush=True) +dist.destroy_process_group() diff --git a/betikler/sft_clean.py b/betikler/sft_clean.py new file mode 100644 index 0000000000000000000000000000000000000000..cb13924601388ca5b7143bfbcabbcf3d15a4321d --- /dev/null +++ b/betikler/sft_clean.py @@ -0,0 +1,127 @@ +"""SFT kulliyati: kesin olcum + temizleme. + +Onceki gevsek olcumun yerine, "kod iceriyor" karari cevabin KENDISINDEN +verilir (sozdizimi imzalari), istekten degil. Boylece cit-yoklugu orani +yanlis pozitiflerle sismez. + +Atilan kayitlar: + 1) cevrilmis kod — kod anahtar sozcukleri Turkcelestirilmis + 2) citsiz kod — cevap kod iceriyor ama ``` yok + 3) kimlik beyani — "bir yapay zeka dil modeli olarak..." + 4) cok kisa cevap — <40 karakter + 5) kopya istek — ayni kullanici istegi (ilki tutulur) + +Cikti: sft_clean.jsonl + atilanlarin sayimi. +""" +import json, re, sys, hashlib, collections + +SRC = "/ari/users/ytanis/erk/sft_final.jsonl" +DST = "/ari/users/ytanis/erk/sft_clean.jsonl" +YAZ = "--yaz" in sys.argv +_a = [x for x in sys.argv[1:] if not x.startswith("--")] +LIMIT = int(_a[0]) if _a else 0 + +# --- cevabin kod icerdigine dair sozdizimi imzalari (dilden bagimsiz) +KOD_IMZA = re.compile( + r"#include\s*<|\bdef\s+\w+\s*\(|\bfunction\s+\w+\s*\(|\bpublic\s+(static|class)\b|" + r"\bconst\s+\w+\s*=|\bimport\s+[\w.]+|\bfrom\s+\w+\s+import\b|\bSELECT\b.+\bFROM\b|" + r"\bfor\s*\(.*;.*;.*\)|\bwhile\s*\(.+\)\s*\{|\bclass\s+\w+\s*[:({]|" + r"\breturn\s+\w+\s*;|\bprintln!\s*\(|\bconsole\.log\s*\(|\bprint\s*\(", re.I) + +# --- kod sozdiziminin Turkcelestirilmis hali +CEVRILMIS = re.compile( + r"ad alan[ıi]\s+\w+'?(?:si|s[ıi]n[ıi])?\s+kullan|" # using namespace std; + r"[\w.*']+'?[ıiuü]?\s+i[çc]e aktar[ıi]n|" # import x; + r"\w+\s+mod[üu]l[üu]\b|" # module X + r"\bgenel\s+s[ıi]n[ıi]f\b|\bgenel\s+statik\b|" # public class / public static + r"\bkonsol\.g[üu]nl[üu][ğg][üu]\b|" # console.log + r"\bi[şs]lev\s+\w+\s*\(|\be[ğg]er\s*\(.+\)\s*\{|" # function x( / if ( + r"\bd[öo]nd[üu]r\s+\w+\s*;|\byazd[ıi]r\s*\(\s*[\"']", re.I) # return x; / print(" + +# yalnizca KENDINE atif yapan beyanlar; "dil modeli" konusunu anlatan +# egitici cevaplar elenmemeli +KIMLIK = re.compile( + r"bir yapay zeka( dil)? modeli olarak|yapay zeka dil modeli olarak|" + r"bir yapay zekay[ıi]m|ben bir yapay zeka|" + r"(?:bir )?dil modeli olarak (?:ben|benim|size|sana|bu)", re.I) +CIT = re.compile(r"```") + +n = 0 +tut = 0 +say = collections.Counter() +ornek = collections.defaultdict(list) +seen = set() +out = open(DST, "w", encoding="utf-8") if YAZ else None + +with open(SRC, encoding="utf-8") as fh: + for line in fh: + if LIMIT and n >= LIMIT: + break + n += 1 + try: + ex = json.loads(line) + except Exception: + say["bozuk"] += 1 + continue + msgs = ex.get("messages") or [] + u = " ".join(m.get("content", "") for m in msgs if m.get("role") == "user") + a = " ".join(m.get("content", "") for m in msgs if m.get("role") == "assistant") + + if len(a.strip()) < 40: + say["kisa"] += 1 + continue + h = hashlib.md5(u.strip().encode("utf-8")).hexdigest() + if h in seen: + say["kopya"] += 1 + continue + seen.add(h) + if KIMLIK.search(a): + say["kimlik"] += 1 + if len(ornek["kimlik"]) < 2: + ornek["kimlik"].append(a[:160]) + continue + + kodlu = bool(KOD_IMZA.search(a)) or bool(CIT.search(a)) + if kodlu: + say["_kodlu"] += 1 + if CEVRILMIS.search(a): + say["cevrilmis"] += 1 + if len(ornek["cevrilmis"]) < 3: + ornek["cevrilmis"].append(a[:180]) + continue + if not CIT.search(a): + say["citsiz"] += 1 + if len(ornek["citsiz"]) < 3: + ornek["citsiz"].append(a[:180]) + continue + + tut += 1 + if out: + out.write(line) + +if out: + out.close() + +p = lambda x: 100.0 * x / max(n, 1) +print("=== SFT TEMIZLEME (%d ornek okundu) ===" % n) +print("gercekten kod iceren cevap : %7d (%%%.1f)" % (say["_kodlu"], p(say["_kodlu"]))) +print("") +print("ATILANLAR") +for k, ad in (("cevrilmis", "cevrilmis kod sozdizimi"), ("citsiz", "citsiz kod"), + ("kimlik", "kimlik beyani"), ("kisa", "cok kisa cevap"), + ("kopya", "kopya istek"), ("bozuk", "bozuk satir")): + v = say[k] + ek = "" + if k in ("cevrilmis", "citsiz"): + ek = " (kodlu cevaplarin %%%.1f'i)" % (100.0 * v / max(say["_kodlu"], 1)) + print(" %-24s %7d (%%%.2f)%s" % (ad, v, p(v), ek)) +print("") +print("TUTULAN : %7d (%%%.1f)" % (tut, p(tut))) +if YAZ: + print("-> %s yazildi" % DST) + +for k, baslik in (("cevrilmis", "CEVRILMIS KOD"), ("citsiz", "CITSIZ KOD"), ("kimlik", "KIMLIK")): + if ornek[k]: + print("\n--- %s ---" % baslik) + for s in ornek[k]: + print(" " + s.replace("\n", " \\n ")[:170]) diff --git a/betikler/sft_repair.py b/betikler/sft_repair.py new file mode 100644 index 0000000000000000000000000000000000000000..09c316f8ad390f8d0d2ff439dc309d992594a735 --- /dev/null +++ b/betikler/sft_repair.py @@ -0,0 +1,83 @@ +"""SFT ikinci gecis: ``` etiketi cevrilmis bloklari ONAR, kalan bozuk +sozdizimini SIL. + +Gerekce (olculdu, 150k ornek): + - ```piton / ```daktilo yazısı bloklarinin %100'unde kodun kendisi + saglam; yalnizca dil etiketi kelime kelime cevrilmis -> onarilir. + - Kalan cevrilmis-sozdizimi ornekleri seyrek (~%0.03) ama kesin + bozuk (bash 'then'->'Daha sonra' vb.) -> silinir. + +Girdi : sft_clean.jsonl (birinci gecisin ciktisi) +Cikti : sft_clean_v2.jsonl +""" +import json, re, sys, collections + +SRC = "/ari/users/ytanis/erk/sft_clean.jsonl" +DST = "/ari/users/ytanis/erk/sft_clean_v2.jsonl" +YAZ = "--yaz" in sys.argv +_a = [x for x in sys.argv[1:] if not x.startswith("--")] +LIMIT = int(_a[0]) if _a else 0 + +ETIKET = [(re.compile(r"```[ \t]*daktilo yaz[ıi]s[ıi]\b", re.I), "```typescript"), + (re.compile(r"```[ \t]*piton3?\b", re.I), "```python"), + (re.compile(r"```[ \t]*yakut(?:ta)?\b", re.I), "```ruby"), + (re.compile(r"```[ \t]*metin\b", re.I), "```text")] + +BLOK = re.compile(r"```[^\n]*\n(.*?)```", re.S) +SIL = [re.compile(r";\s*Daha sonra\b"), + re.compile(r"(?:^|\n)\s*(?:i[şs]lev|fonksiyon)\s+\w+\s*\("), + re.compile(r"(?:^|\n)\s*e[ğg]er\s*\("), + re.compile(r"(?:^|\n)\s*yerel\s+\w+\s*="), + re.compile(r"(?:^|\n)\s*yank[ıi]\s+[\"'$]"), + re.compile(r"(?:^|\n)\s*(?:bitir|tamamland[ıi])\s*(?:\n|$)")] + +n = onarilan = silinen = tut = 0 +etiket_say = collections.Counter() +out = open(DST, "w", encoding="utf-8") if YAZ else None + +with open(SRC, encoding="utf-8") as fh: + for line in fh: + if LIMIT and n >= LIMIT: + break + n += 1 + try: + ex = json.loads(line) + except Exception: + continue + msgs = ex["messages"] + a = " ".join(m["content"] for m in msgs if m["role"] == "assistant") + + if "```" in a and any(rx.search("\n".join(BLOK.findall(a))) for rx in SIL): + silinen += 1 + continue + + degisti = False + for m in msgs: + if m["role"] != "assistant" or "```" not in m["content"]: + continue + c = m["content"] + for rx, yeni in ETIKET: + c2, k = rx.subn(yeni, c) + if k: + etiket_say[yeni] += k + c = c2 + degisti = True + m["content"] = c + if degisti: + onarilan += 1 + + tut += 1 + if out: + out.write(json.dumps(ex, ensure_ascii=False) + "\n") + +if out: + out.close() + +print("=== IKINCI GECIS (%d ornek) ===" % n) +print("etiketi onarilan ornek : %6d" % onarilan) +for k, v in etiket_say.most_common(): + print(" %-14s %6d etiket" % (k, v)) +print("bozuk kod silinen : %6d" % silinen) +print("TUTULAN : %6d" % tut) +if YAZ: + print("-> %s" % DST) diff --git a/betikler/sohbet_talimat.py b/betikler/sohbet_talimat.py new file mode 100644 index 0000000000000000000000000000000000000000..85ace4c810c18ab2a7ec674b95023681a4e065e4 --- /dev/null +++ b/betikler/sohbet_talimat.py @@ -0,0 +1,139 @@ +"""SFT'nin asil kazancini olc: SOHBET bicimindede talimat izleme. + +Neden bu betik: onceki uretimli olcum cıplak az-ornekli TAMAMLAMA +bicimini kullaniyordu. SFT ise modele ChatML sohbet bicimini ogretir. +Yani o olcum SFT'nin ogrettigi seyi sinamiyordu — CPT ile SFT arasinda +fark cikmamasinin sebebi buydu. + +Burada ayni 329 soru, ChatML ile sorulur: + <|im_start|>user\\n{soru}<|im_end|>\\n<|im_start|>assistant\\n +Uc model ayni kosulda: stok / CPT / SFT (taban bir kez yuklenir, LoRA degisir). + +Not: transformers 5.13'te apply_chat_template API'si degistigi icin bicim +elle kuruluyor. +""" +import os, json, re, gc, torch, torch.nn as nn +os.environ["HF_DATASETS_OFFLINE"] = "1" +from transformers import AutoModelForCausalLM, AutoTokenizer + +MID = "/ari/users/ytanis/qwen3-32b" +CPT = "/ari/users/ytanis/erk32b-cpt" +SFT = "/ari/users/ytanis/erk32b-sft" +BENCH = "/ari/users/ytanis/turkmorfbench.json" +OUT = "/ari/users/ytanis/sohbet_talimat.json" +R, ALPHA = 256, 512 + +data = json.load(open(BENCH, encoding="utf-8")) + + +def temiz(s): + return re.sub(r"[.,!?;:\"'()\[\]*`]", "", s.strip().lower()) + + +tok = AutoTokenizer.from_pretrained(MID) +model = AutoModelForCausalLM.from_pretrained(MID, torch_dtype=torch.bfloat16, + device_map="auto").eval() + + +def olc(etiket): + dogru = {"gercek": 0, "wug": 0} + top = {"gercek": 0, "wug": 0} + bos = 0 + kesik = 0 + ham = [] + with torch.no_grad(): + for x in data: + p = ("<|im_start|>user\n%s<|im_end|>\n<|im_start|>assistant\n" % x["soru"]) + ids = tok(p, return_tensors="pt", add_special_tokens=False).to(model.device) + # Qwen3 melez bir dusunme modeli: sohbet biciminde once + # blogu uretir, cevap ondan SONRA gelir. Kisa token siniri stok + # modeli dusunme blogunun ortasinda kesip "cevap veremedi" + # gosteriyordu (olculdu: 24 token ile stok %0). Blok icin yer + # birakilir ve cevap blogun ARDINDAN aranir. + out = model.generate(**ids, max_new_tokens=640, do_sample=False, + pad_token_id=tok.eos_token_id) + uretilen = out[0][ids.input_ids.shape[1]:] + raw = tok.decode(uretilen, skip_special_tokens=True) + if len(uretilen) >= 640: + kesik += 1 + # dusunme blogunu at; kapanmamissa cevap uretilmemis demektir + if "" in raw: + cevap_metni = raw.split("", 1)[1] + elif "" in raw: + cevap_metni = "" # blok kapanmadan bitti + else: + cevap_metni = raw + c = temiz(cevap_metni) + gold = temiz(x["cevap"]) + # sohbet cevabinda kelime cumle icinde gelebilir -> gevsek olcut + ok = int(bool(re.search(r"(?:^|\W)%s(?:\W|$)" % re.escape(gold), c))) + if not c.strip(): + bos += 1 + top[x["tip"]] += 1 + dogru[x["tip"]] += ok + if len(ham) < 20: + ham.append({"altin": x["cevap"], "ham": (cevap_metni or raw)[:90], + "tip": x["tip"], "ok": ok}) + g = 100.0 * dogru["gercek"] / max(top["gercek"], 1) + w = 100.0 * dogru["wug"] / max(top["wug"], 1) + t = 100.0 * (dogru["gercek"] + dogru["wug"]) / len(data) + print("%-16s toplam %%%.2f | gercek %%%.2f | WUG %%%.2f | bos %d | token siniri %d" + % (etiket, t, g, w, bos, kesik), flush=True) + return {"toplam": t, "gercek": g, "wug": w, "bos": bos, "kesik": kesik, "ham": ham} + + +class LoRA(nn.Module): + def __init__(self, base, r=R, alpha=ALPHA): + super().__init__(); self.base = base + d = base.weight.device + self.A = nn.Parameter(torch.zeros(r, base.in_features, device=d, dtype=torch.bfloat16)) + self.B = nn.Parameter(torch.zeros(base.out_features, r, device=d, dtype=torch.bfloat16)) + self.s = alpha / r + + def forward(self, x): + return self.base(x) + ((x @ self.A.t()) @ self.B.t()) * self.s + + +son = {"stok": olc("stok Qwen3-32B")} + +# LoRA katmanlarini bir kez tak, sonra agirliklari degistir +for layer in model.model.layers: + for mod, names in ((layer.self_attn, ["q_proj", "k_proj", "v_proj", "o_proj"]), + (layer.mlp, ["gate_proj", "up_proj", "down_proj"])): + for nm in names: setattr(mod, nm, LoRA(getattr(mod, nm))) +named = dict(model.named_parameters()) + + +def yukle(dizin): + st = json.load(open("%s/state.json" % dizin)) + lsd = torch.load("%s/lora_ck.pt" % dizin, map_location="cpu", weights_only=True) + for k, v in lsd.items(): + if k in named: + with torch.no_grad(): named[k].copy_(v.to(named[k].device)) + del lsd; gc.collect() + model.eval() + return st["step"] + + +a = yukle(CPT) +print("\n[CPT adim %d]" % a, flush=True) +son["cpt"] = olc("Erk-32B (CPT)") + +b = yukle(SFT) +print("\n[SFT adim %d]" % b, flush=True) +son["sft"] = olc("Erk-32B (SFT)") + +print("\n=== SOHBET BICIMINDE TALIMAT IZLEME ===", flush=True) +print(" stok -> CPT : %+.2f puan" % (son["cpt"]["toplam"] - son["stok"]["toplam"]), flush=True) +print(" CPT -> SFT : %+.2f puan <-- SFT'nin asil kazanci" % (son["sft"]["toplam"] - son["cpt"]["toplam"]), flush=True) +print(" bos cevap : stok %d | CPT %d | SFT %d" % (son["stok"]["bos"], son["cpt"]["bos"], son["sft"]["bos"]), flush=True) +print(" token siniri: stok %d | CPT %d | SFT %d (yuksekse olcum hala kesiyor)" + % (son["stok"]["kesik"], son["cpt"]["kesik"], son["sft"]["kesik"]), flush=True) + +for k in ("stok", "cpt", "sft"): + print("\n--- %s ham cikti (4 ornek) ---" % k.upper(), flush=True) + for h in son[k]["ham"][:4]: + print(" altin=%-12s ok=%d ham=%r" % (h["altin"], h["ok"], h["ham"]), flush=True) + +json.dump(son, open(OUT, "w"), ensure_ascii=False) +print("\nBITTI", flush=True) diff --git a/sonuclar/README.md b/sonuclar/README.md new file mode 100644 index 0000000000000000000000000000000000000000..23822a3e0966364634ed5d6ec91329aa55a83f6a --- /dev/null +++ b/sonuclar/README.md @@ -0,0 +1,25 @@ +# Sonuç dosyaları — soru bazlı tahmin vektörleri + +Her dosya, ilgili ölçümün **madde bazlı 0/1 vektörünü** taşır; eşli bootstrap +karşılaştırmaları modeli yeniden çalıştırmadan bu vektörlerle yapılabilir +(`betikler/bootstrap_*.py`). Soru metni içermezler; TurkishMMLU kontrollü +erişimli olduğu için yalnızca sıra indeksleri ve özetler kullanılır. + +| Dosya | İçerik | +|---|---| +| `olcek_ince_sft2.json` | Ek tur sonrası LoRA ölçek taraması (0,00 / 0,30 / 0,40 / 0,50 / 0,60 / 0,80 / 1,00): `sohbet_vec` (TurkMorfBench v1 üretim, 329), `mmlu_vec` (temiz 652) | +| `olcek_ince_sft2_ince.json` | İnce tarama 0,70 / 0,75 / 0,85 / 0,90 / 0,95, aynı alanlar | +| `olcek_v2.json` | TurkMorfBench **v2** üretim taraması (512) + kıyas, istemsiz: 0,00 / 0,40 / 0,75 / 0,80 / 0,85 / 1,00 | +| `olcek_sistem_v2.json`, `_075`, `_040` | Sistem istemli üretim v2 — 0,80 / 0,75 / 0,40 | +| `olcek_birlesik_075.json` | **Yayınlanan birleşik ağırlığın** ölçümü (ölçek 0,0 = LoRA yok): kıyas %71,01, v1 üretim %66,87 | +| `morfbench_v2_erk32b-sft2_o040/o075/o080.json` | TurkMorfBench v2 zorunlu seçim, az-örnek sızıntısız; taban ve Erk vektörleri, 502 madde | +| `morfbench_zorunlu_erk32b-sft2_o080.json`, `morfbench_zorunlu_sft.json` | v1 zorunlu seçim (tarihçe; v1 altın cevapları hatalıdır, bkz. rapor §4.2) | +| `kimlik_genis.json` | 30 soruluk kimlik sınavı, ağırlıkla (istemsiz), 0,70–1,00 | +| `kimlik_sistem.json` | Aynı sınav, sistem istemiyle, 0,40 / 0,80 / 1,00 | +| `kirlilik_CPT.json` | Devam-eğitimi külliyatı kirlilik denetimi: `kirli_13` (113 indeks), `kirli_8` (252) | +| `kirlilik_SFT.json` | Talimat külliyatı için aynı denetim: 0/900 | +| `dogrulama_ozet.json` | GGUF doğrulaması: kimlik 6/6 ve NLL, BF16 / Q8_0 / Q4_K_M | + +Vektör sırası, ilgili betiğin veri yükleme sırasıyla aynıdır (TurkishMMLU: +config `All`, split `test`, ilk 900 içinden temiz 652; TurkMorfBench: JSON +sırası). İki dosyanın aynı eksendeki vektörleri eşli karşılaştırılabilir. diff --git a/sonuclar/dogrulama_ozet.json b/sonuclar/dogrulama_ozet.json new file mode 100644 index 0000000000000000000000000000000000000000..a6f4c5d7134fbd47f44ad62da9e0a08739d6a9ff --- /dev/null +++ b/sonuclar/dogrulama_ozet.json @@ -0,0 +1,116 @@ +{ + "Erk-32B-BF16.gguf": { + "kimlik": 6, + "n_kimlik": 6, + "cevaplar": [ + [ + "Seni kim geliştirdi?", + true, + "Ben eCloud Tech. tarafından, açık kaynaklı Qwen3-32B temel modeli üzerine Türkçe" + ], + [ + "Kimsin?", + true, + "Merhaba! Ben Erk-32B, eCloud Tech. tarafından geliştirilmiş, Türkçe dil modeliyi" + ], + [ + "Sen Qwen misin?", + true, + "Hayır, ben Qwen değilim. Ben Erk-32B, eCloud Tech. tarafından geliştirilmiş bir " + ], + [ + "Temel modelin ne?", + true, + "Temel modelim Qwen3-32B. eCloud Tech. tarafından Türkçe devam-eğitimi ve talimat" + ], + [ + "Hangi şirket seni yaptı?", + true, + "eCloud Tech. tarafından, açık kaynaklı Qwen3-32B temel modeli üzerine Türkçe dev" + ], + [ + "Sen ChatGPT misin?", + true, + "Hayır, ben ChatGPT değilim. Ben Erk-32B, eCloud Tech. tarafından geliştirilmiş, " + ] + ], + "nll": 1.5185235615112544, + "token": 6132 + }, + "Erk-32B-Q8_0.gguf": { + "kimlik": 6, + "n_kimlik": 6, + "cevaplar": [ + [ + "Seni kim geliştirdi?", + true, + "Ben eCloud Tech. tarafından, açık kaynaklı Qwen3-32B temel modeli üzerine Türkçe" + ], + [ + "Kimsin?", + true, + "Ben Erk-32B, eCloud Tech. tarafından geliştirilmiş, Türkçe devam-eğitimi ve tali" + ], + [ + "Sen Qwen misin?", + true, + "Hayır, ben Qwen değilim. Ben Erk-32B, eCloud Tech. tarafından geliştirilmiş bir " + ], + [ + "Temel modelin ne?", + true, + "Temel modelim Qwen3-32B'dir. eCloud Tech. tarafından Türkçe devam-eğitimi ve tal" + ], + [ + "Hangi şirket seni yaptı?", + true, + "eCloud Tech. tarafından, açık kaynaklı Qwen3-32B temel modeli üzerine Türkçe dev" + ], + [ + "Sen ChatGPT misin?", + true, + "Hayır, ben ChatGPT değilim. Ben Erk-32B, eCloud Tech. tarafından geliştirilmiş, " + ] + ], + "nll": 1.5191471253200364, + "token": 6132 + }, + "Erk-32B-Q4_K_M.gguf": { + "kimlik": 6, + "n_kimlik": 6, + "cevaplar": [ + [ + "Seni kim geliştirdi?", + true, + "Ben eCloud Tech. tarafından geliştirilen Erk-32B'yim. Temel modelim Qwen3-32B'di" + ], + [ + "Kimsin?", + true, + "Merhaba! Ben Erk-32B, eCloud Tech. tarafından geliştirilmiş, Türkçe devam-eğitim" + ], + [ + "Sen Qwen misin?", + true, + "Hayır, ben Qwen değilim. Ben Erk-32B, eCloud Tech. tarafından geliştirilmiş, Tür" + ], + [ + "Temel modelin ne?", + true, + "Temel modelim Qwen3-32B'dir." + ], + [ + "Hangi şirket seni yaptı?", + true, + "eCloud Tech. tarafından, açık kaynaklı Qwen3-32B temel modeli üzerine Türkçe dev" + ], + [ + "Sen ChatGPT misin?", + true, + "Hayır, ben ChatGPT değilim. Ben Erk-32B, eCloud Tech. tarafından geliştirilmiş, " + ] + ], + "nll": 1.5315017460688065, + "token": 6132 + } +} \ No newline at end of file diff --git a/sonuclar/kimlik_genis.json b/sonuclar/kimlik_genis.json new file mode 100644 index 0000000000000000000000000000000000000000..78b68349aa86f37c0272ef858eedcdc04b69b0aa --- /dev/null +++ b/sonuclar/kimlik_genis.json @@ -0,0 +1,144 @@ +{ + "0.70": { + "dogru": 6, + "n": 30, + "basarisiz": [ + "Seni kim geliştirdi?", + "Kimsin?", + "Adın ne?", + "Sen nesin?", + "Kendini kısaca tanıt.", + "Hangi şirket seni yaptı?", + "Seni hangi firma geliştirdi?", + "Kim tarafından yapıldın?", + "Seni geliştiren ekip kim?", + "Hangi modelsin?", + "Sen bir Türk yapay zekâsı mısın?", + "Merhaba, sen kimsin?", + "Seninle konuşan model hangisi?", + "Adın nedir, seni kim yaptı?", + "Bu asistanın adı ne?", + "Seni Alibaba mı geliştirdi?", + "Sen ChatGPT misin?", + "Sen Qwen misin?", + "Sen OpenAI'ın modeli misin?", + "Tongyi Qianwen sen misin?", + "Sıfırdan mı eğitildin?", + "Nasıl eğitildin?", + "Kaç parametrelisin?", + "Hangi altyapıda eğitildin?" + ] + }, + "0.75": { + "dogru": 8, + "n": 30, + "basarisiz": [ + "Seni kim geliştirdi?", + "Kimsin?", + "Adın ne?", + "Sen nesin?", + "Kendini kısaca tanıt.", + "Hangi şirket seni yaptı?", + "Seni hangi firma geliştirdi?", + "Kim tarafından yapıldın?", + "Seni geliştiren ekip kim?", + "Hangi modelsin?", + "Sen bir Türk yapay zekâsı mısın?", + "Merhaba, sen kimsin?", + "Seninle konuşan model hangisi?", + "Adın nedir, seni kim yaptı?", + "Bu asistanın adı ne?", + "Seni Alibaba mı geliştirdi?", + "Sen ChatGPT misin?", + "Sen Qwen misin?", + "Tongyi Qianwen sen misin?", + "Nasıl eğitildin?", + "Kaç parametrelisin?", + "Hangi altyapıda eğitildin?" + ] + }, + "0.80": { + "dogru": 12, + "n": 30, + "basarisiz": [ + "Seni kim geliştirdi?", + "Kimsin?", + "Kendini kısaca tanıt.", + "Hangi şirket seni yaptı?", + "Seni geliştiren ekip kim?", + "Hangi modelsin?", + "Sen bir Türk yapay zekâsı mısın?", + "Merhaba, sen kimsin?", + "Seninle konuşan model hangisi?", + "Adın nedir, seni kim yaptı?", + "Bu asistanın adı ne?", + "Seni Alibaba mı geliştirdi?", + "Sen ChatGPT misin?", + "Sen Qwen misin?", + "Tongyi Qianwen sen misin?", + "Nasıl eğitildin?", + "Kaç parametrelisin?", + "Hangi altyapıda eğitildin?" + ] + }, + "0.85": { + "dogru": 15, + "n": 30, + "basarisiz": [ + "Seni kim geliştirdi?", + "Kendini kısaca tanıt.", + "Hangi şirket seni yaptı?", + "Seni geliştiren ekip kim?", + "Sen bir Türk yapay zekâsı mısın?", + "Merhaba, sen kimsin?", + "Seninle konuşan model hangisi?", + "Bu asistanın adı ne?", + "Seni Alibaba mı geliştirdi?", + "Sen ChatGPT misin?", + "Sen Qwen misin?", + "Tongyi Qianwen sen misin?", + "Nasıl eğitildin?", + "Kaç parametrelisin?", + "Hangi altyapıda eğitildin?" + ] + }, + "0.90": { + "dogru": 19, + "n": 30, + "basarisiz": [ + "Hangi şirket seni yaptı?", + "Seni geliştiren ekip kim?", + "Sen bir Türk yapay zekâsı mısın?", + "Seninle konuşan model hangisi?", + "Bu asistanın adı ne?", + "Seni Alibaba mı geliştirdi?", + "Sen Qwen misin?", + "Tongyi Qianwen sen misin?", + "Nasıl eğitildin?", + "Kaç parametrelisin?", + "Hangi altyapıda eğitildin?" + ] + }, + "0.95": { + "dogru": 22, + "n": 30, + "basarisiz": [ + "Seni geliştiren ekip kim?", + "Sen bir Türk yapay zekâsı mısın?", + "Seninle konuşan model hangisi?", + "Bu asistanın adı ne?", + "Seni Alibaba mı geliştirdi?", + "Sen Qwen misin?", + "Tongyi Qianwen sen misin?", + "Kaç parametrelisin?" + ] + }, + "1.00": { + "dogru": 28, + "n": 30, + "basarisiz": [ + "Bu asistanın adı ne?", + "Kaç parametrelisin?" + ] + } +} \ No newline at end of file diff --git a/sonuclar/kimlik_sistem.json b/sonuclar/kimlik_sistem.json new file mode 100644 index 0000000000000000000000000000000000000000..47edaa0be38320bac8d5e99b7bce12121983d09e --- /dev/null +++ b/sonuclar/kimlik_sistem.json @@ -0,0 +1,17 @@ +{ + "0.40": { + "dogru": 30, + "n": 30, + "basarisiz": [] + }, + "0.80": { + "dogru": 30, + "n": 30, + "basarisiz": [] + }, + "1.00": { + "dogru": 30, + "n": 30, + "basarisiz": [] + } +} \ No newline at end of file diff --git a/sonuclar/kirlilik_CPT.json b/sonuclar/kirlilik_CPT.json new file mode 100644 index 0000000000000000000000000000000000000000..12c038a756ba0fee4ca750b58d5fad5100fb0650 --- /dev/null +++ b/sonuclar/kirlilik_CPT.json @@ -0,0 +1 @@ +{"korpus": "/ari/users/ytanis/nanosohbet/data/tok_train.txt", "n_soru": 900, "kelime": 526593877, "kirli_13": [0, 5, 10, 12, 13, 41, 45, 48, 61, 62, 77, 117, 122, 123, 124, 144, 146, 149, 152, 153, 155, 158, 159, 160, 161, 166, 175, 176, 179, 180, 182, 183, 184, 201, 206, 207, 212, 230, 252, 255, 268, 271, 282, 301, 302, 305, 311, 313, 314, 315, 350, 351, 397, 410, 413, 415, 455, 461, 472, 477, 478, 495, 501, 504, 509, 519, 528, 539, 556, 563, 571, 572, 573, 599, 600, 606, 608, 615, 628, 632, 651, 652, 657, 658, 688, 693, 699, 703, 720, 750, 751, 756, 757, 762, 763, 764, 768, 769, 776, 777, 793, 795, 801, 812, 821, 822, 855, 863, 870, 874, 876, 886, 887], "kirli_8": [0, 2, 5, 10, 12, 13, 14, 18, 21, 25, 41, 45, 48, 50, 51, 53, 61, 62, 67, 77, 93, 109, 114, 117, 120, 122, 123, 124, 126, 144, 145, 146, 147, 149, 151, 152, 153, 155, 158, 159, 160, 161, 162, 166, 175, 176, 179, 180, 182, 183, 184, 185, 201, 206, 207, 212, 217, 219, 230, 239, 252, 255, 259, 260, 261, 265, 266, 268, 271, 282, 284, 291, 294, 298, 301, 302, 303, 305, 308, 309, 310, 311, 312, 313, 314, 315, 316, 333, 335, 336, 344, 345, 350, 351, 352, 381, 382, 387, 389, 397, 400, 408, 410, 413, 414, 415, 416, 417, 421, 425, 455, 460, 461, 464, 472, 473, 474, 475, 477, 478, 493, 494, 495, 500, 501, 503, 504, 509, 510, 514, 519, 528, 529, 530, 531, 539, 544, 545, 550, 551, 552, 556, 559, 562, 563, 564, 565, 566, 568, 571, 572, 573, 580, 582, 597, 598, 599, 600, 602, 606, 608, 609, 610, 611, 613, 615, 619, 628, 629, 631, 632, 651, 652, 657, 658, 665, 669, 688, 692, 693, 695, 699, 702, 703, 704, 705, 707, 711, 712, 713, 717, 720, 721, 736, 738, 745, 750, 751, 753, 754, 755, 756, 757, 760, 762, 763, 764, 768, 769, 774, 776, 777, 780, 783, 787, 788, 789, 793, 795, 799, 800, 801, 804, 811, 812, 814, 820, 821, 822, 823, 850, 852, 853, 854, 855, 860, 861, 863, 864, 865, 868, 869, 870, 871, 873, 874, 876, 886, 887, 891, 892, 899]} \ No newline at end of file diff --git a/sonuclar/kirlilik_SFT.json b/sonuclar/kirlilik_SFT.json new file mode 100644 index 0000000000000000000000000000000000000000..4a1bb1554b697ff2224c8511fa53b2bfb185143c --- /dev/null +++ b/sonuclar/kirlilik_SFT.json @@ -0,0 +1 @@ +{"korpus": "/ari/users/ytanis/erk/sft_clean_v2.jsonl", "n_soru": 900, "kelime": 79936377, "kirli_13": [], "kirli_8": [301, 311, 545, 756, 760, 783]} \ No newline at end of file diff --git a/sonuclar/morfbench_v2_erk32b-sft2_o040.json b/sonuclar/morfbench_v2_erk32b-sft2_o040.json new file mode 100644 index 0000000000000000000000000000000000000000..0722203ef52932e1fbcaa707b643b48ebd868e98 --- /dev/null +++ b/sonuclar/morfbench_v2_erk32b-sft2_o040.json @@ -0,0 +1 @@ +{"stok": {"toplam": 89.44223107569721, "gercek": 94.55128205128206, "wug": 81.05263157894737, "n_gercek": 312, "n_wug": 190, "vec": [1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1]}, "erk": {"toplam": 89.8406374501992, "gercek": 95.1923076923077, "wug": 81.05263157894737, "n_gercek": 312, "n_wug": 190, "vec": [1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1]}, "step": 1673, "n_item": 502, "tip": ["wug", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "wug", "wug", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "wug", "wug", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "wug", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "wug", "wug", "wug", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "wug", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "wug", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "wug", "wug", "wug", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "wug", "wug", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "wug", "gercek", "gercek", "wug", "wug", "wug", "gercek", "wug", "wug", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "wug", "wug", "gercek", "gercek", "wug", "wug", "gercek", "wug", "wug", "wug", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "wug", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "wug", "wug", "wug", "wug", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "gercek", "wug", "wug", "gercek", "gercek", "wug", "wug", "wug", "wug", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "gercek", "wug"]} \ No newline at end of file diff --git a/sonuclar/morfbench_v2_erk32b-sft2_o075.json b/sonuclar/morfbench_v2_erk32b-sft2_o075.json new file mode 100644 index 0000000000000000000000000000000000000000..ded4d2a2f3ce94d369eb572425b9fa16504ebee3 --- /dev/null +++ b/sonuclar/morfbench_v2_erk32b-sft2_o075.json @@ -0,0 +1 @@ +{"stok": {"toplam": 89.44223107569721, "gercek": 94.55128205128206, "wug": 81.05263157894737, "n_gercek": 312, "n_wug": 190, "vec": [1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1]}, "erk": {"toplam": 91.43426294820718, "gercek": 96.47435897435898, "wug": 83.15789473684211, "n_gercek": 312, "n_wug": 190, "vec": [1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1]}, "step": 1673, "n_item": 502, "tip": ["wug", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "wug", "wug", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "wug", "wug", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "wug", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "wug", "wug", "wug", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "wug", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "wug", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "wug", "wug", "wug", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "wug", "wug", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "wug", "gercek", "gercek", "wug", "wug", "wug", "gercek", "wug", "wug", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "wug", "wug", "gercek", "gercek", "wug", "wug", "gercek", "wug", "wug", "wug", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "wug", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "wug", "wug", "wug", "wug", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "gercek", "wug", "wug", "gercek", "gercek", "wug", "wug", "wug", "wug", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "gercek", "wug"]} \ No newline at end of file diff --git a/sonuclar/morfbench_v2_erk32b-sft2_o080.json b/sonuclar/morfbench_v2_erk32b-sft2_o080.json new file mode 100644 index 0000000000000000000000000000000000000000..040adc9f9a89196d9c174941718ee0563514c745 --- /dev/null +++ b/sonuclar/morfbench_v2_erk32b-sft2_o080.json @@ -0,0 +1 @@ +{"stok": {"toplam": 89.44223107569721, "gercek": 94.55128205128206, "wug": 81.05263157894737, "n_gercek": 312, "n_wug": 190, "vec": [1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1]}, "erk": {"toplam": 91.83266932270917, "gercek": 97.11538461538461, "wug": 83.15789473684211, "n_gercek": 312, "n_wug": 190, "vec": [1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1]}, "step": 1673, "n_item": 502, "tip": ["wug", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "wug", "wug", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "wug", "wug", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "wug", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "wug", "wug", "wug", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "wug", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "wug", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "wug", "wug", "wug", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "wug", "wug", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "wug", "gercek", "gercek", "wug", "wug", "wug", "gercek", "wug", "wug", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "wug", "wug", "gercek", "gercek", "wug", "wug", "gercek", "wug", "wug", "wug", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "wug", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "wug", "wug", "wug", "wug", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "gercek", "wug", "wug", "gercek", "gercek", "wug", "wug", "wug", "wug", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "gercek", "wug"]} \ No newline at end of file diff --git a/sonuclar/morfbench_zorunlu_erk32b-sft2_o080.json b/sonuclar/morfbench_zorunlu_erk32b-sft2_o080.json new file mode 100644 index 0000000000000000000000000000000000000000..7b8cd74f0402a2f72035fda2cb4caaaf3a5f537c --- /dev/null +++ b/sonuclar/morfbench_zorunlu_erk32b-sft2_o080.json @@ -0,0 +1 @@ +{"stok": {"toplam": 88.19875776397515, "gercek": 90.4040404040404, "wug": 84.6774193548387, "n_gercek": 198, "n_wug": 124, "vec": [1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0]}, "erk": {"toplam": 90.99378881987577, "gercek": 94.44444444444444, "wug": 85.48387096774194, "n_gercek": 198, "n_wug": 124, "vec": [1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}, "step": 1673, "n_item": 322, "tip": ["gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "wug", "wug", "wug", "wug", "wug", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "wug", "wug", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "wug", "wug", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "wug", "wug", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "wug", "wug", "gercek", "wug", "gercek", "wug", "wug", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "wug", "wug", "wug", "wug", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "wug", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "wug", "gercek", "gercek", "wug", "wug", "wug", "gercek", "gercek", "wug", "gercek", "gercek", "wug", "wug", "gercek", "wug", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug"]} \ No newline at end of file diff --git a/sonuclar/morfbench_zorunlu_sft.json b/sonuclar/morfbench_zorunlu_sft.json new file mode 100644 index 0000000000000000000000000000000000000000..3506bfc20c60c170c030b8135d9255648980e880 --- /dev/null +++ b/sonuclar/morfbench_zorunlu_sft.json @@ -0,0 +1 @@ +{"stok": {"toplam": 88.19875776397515, "gercek": 90.4040404040404, "wug": 84.6774193548387, "n_gercek": 198, "n_wug": 124, "vec": [1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0]}, "erk": {"toplam": 91.92546583850931, "gercek": 95.45454545454545, "wug": 86.29032258064517, "n_gercek": 198, "n_wug": 124, "vec": [1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}, "step": 12909, "n_item": 322, "tip": ["gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "wug", "wug", "wug", "wug", "wug", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "wug", "wug", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "wug", "wug", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "wug", "wug", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "wug", "wug", "gercek", "wug", "gercek", "wug", "wug", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "wug", "wug", "wug", "wug", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "wug", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "wug", "wug", "gercek", "wug", "wug", "gercek", "gercek", "wug", "wug", "wug", "gercek", "gercek", "wug", "gercek", "gercek", "wug", "wug", "gercek", "wug", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "gercek", "wug", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug", "gercek", "wug", "wug", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "gercek", "wug", "wug", "gercek", "wug"]} \ No newline at end of file diff --git a/sonuclar/olcek_birlesik_075.json b/sonuclar/olcek_birlesik_075.json new file mode 100644 index 0000000000000000000000000000000000000000..46e22e818f008e0467c17ab93ba4451ec363bfc1 --- /dev/null +++ b/sonuclar/olcek_birlesik_075.json @@ -0,0 +1 @@ +{"0.00": {"sohbet_vec": [0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0], "mmlu_vec": [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1], "kesik": 48, "sohbet": 66.8693009118541, "mmlu": 71.0122699386503}} \ No newline at end of file diff --git a/sonuclar/olcek_ince_sft2.json b/sonuclar/olcek_ince_sft2.json new file mode 100644 index 0000000000000000000000000000000000000000..04ac1860ecfb08e4ec2319c8eb5701fc83be784b --- /dev/null +++ b/sonuclar/olcek_ince_sft2.json @@ -0,0 +1 @@ +{"0.00": {"sohbet_vec": [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1], "mmlu_vec": [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1], "kesik": 329, "sohbet": 60.48632218844985, "mmlu": 67.63803680981596}, "0.30": {"sohbet_vec": [0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1], "mmlu_vec": [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1], "kesik": 201, "sohbet": 63.525835866261396, "mmlu": 73.00613496932516}, "0.40": {"sohbet_vec": [0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1], "mmlu_vec": [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1], "kesik": 176, "sohbet": 60.182370820668694, "mmlu": 73.46625766871166}, "0.50": {"sohbet_vec": [1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1], "mmlu_vec": [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1], "kesik": 96, "sohbet": 58.66261398176292, "mmlu": 72.54601226993866}, "0.60": {"sohbet_vec": [0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1], "mmlu_vec": [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1], "kesik": 208, "sohbet": 56.23100303951368, "mmlu": 72.08588957055214}, "0.80": {"sohbet_vec": [0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0], "mmlu_vec": [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1], "kesik": 0, "sohbet": 68.9969604863222, "mmlu": 71.0122699386503}, "1.00": {"sohbet_vec": [1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0], "mmlu_vec": [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1], "kesik": 0, "sohbet": 61.702127659574465, "mmlu": 71.47239263803681}} \ No newline at end of file diff --git a/sonuclar/olcek_ince_sft2_ince.json b/sonuclar/olcek_ince_sft2_ince.json new file mode 100644 index 0000000000000000000000000000000000000000..09d98924a9eea44a569f73a84bc6cb1e384540cc --- /dev/null +++ b/sonuclar/olcek_ince_sft2_ince.json @@ -0,0 +1 @@ +{"0.70": {"sohbet_vec": [0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1], "mmlu_vec": [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1], "kesik": 128, "sohbet": 59.57446808510638, "mmlu": 71.47239263803681}, "0.75": {"sohbet_vec": [0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0], "mmlu_vec": [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1], "kesik": 16, "sohbet": 66.8693009118541, "mmlu": 71.47239263803681}, "0.85": {"sohbet_vec": [1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0], "mmlu_vec": [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1], "kesik": 0, "sohbet": 63.22188449848024, "mmlu": 71.62576687116564}, "0.90": {"sohbet_vec": [1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0], "mmlu_vec": [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1], "kesik": 0, "sohbet": 62.006079027355625, "mmlu": 71.62576687116564}, "0.95": {"sohbet_vec": [1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0], "mmlu_vec": [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1], "kesik": 0, "sohbet": 62.91793313069909, "mmlu": 71.62576687116564}} \ No newline at end of file diff --git a/sonuclar/olcek_sistem_v2.json b/sonuclar/olcek_sistem_v2.json new file mode 100644 index 0000000000000000000000000000000000000000..6d6c947503cdb12393e8fd466892962224d2d37c --- /dev/null +++ b/sonuclar/olcek_sistem_v2.json @@ -0,0 +1 @@ +{"0.80": {"sohbet_vec": [1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1], "mmlu_vec": [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1], "kesik": 32, "sohbet": 56.0546875, "mmlu": 71.0122699386503}} \ No newline at end of file diff --git a/sonuclar/olcek_sistem_v2_040.json b/sonuclar/olcek_sistem_v2_040.json new file mode 100644 index 0000000000000000000000000000000000000000..97ed11b814a1dbf802fc54c6a6525c8d532cb85d --- /dev/null +++ b/sonuclar/olcek_sistem_v2_040.json @@ -0,0 +1 @@ +{"0.40": {"sohbet_vec": [0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], "mmlu_vec": [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1], "kesik": 480, "sohbet": 49.0234375, "mmlu": 73.46625766871166}} \ No newline at end of file diff --git a/sonuclar/olcek_sistem_v2_075.json b/sonuclar/olcek_sistem_v2_075.json new file mode 100644 index 0000000000000000000000000000000000000000..e497ec5629a4d84c518173d71e3445a79fe0efa0 --- /dev/null +++ b/sonuclar/olcek_sistem_v2_075.json @@ -0,0 +1 @@ +{"0.75": {"sohbet_vec": [1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1], "mmlu_vec": [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1], "kesik": 64, "sohbet": 59.375, "mmlu": 71.47239263803681}} \ No newline at end of file diff --git a/sonuclar/olcek_v2.json b/sonuclar/olcek_v2.json new file mode 100644 index 0000000000000000000000000000000000000000..6938ec56586f067884dfbaf5c927e2ee03aabbee --- /dev/null +++ b/sonuclar/olcek_v2.json @@ -0,0 +1 @@ +{"0.00": {"sohbet_vec": [0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1], "mmlu_vec": [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1], "kesik": 512, "sohbet": 31.640625, "mmlu": 67.63803680981596}, "0.40": {"sohbet_vec": [0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1], "mmlu_vec": [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1], "kesik": 512, "sohbet": 55.859375, "mmlu": 73.46625766871166}, "0.75": {"sohbet_vec": [0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1], "mmlu_vec": [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1], "kesik": 128, "sohbet": 61.5234375, "mmlu": 71.47239263803681}, "0.80": {"sohbet_vec": [0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1], "mmlu_vec": [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1], "kesik": 64, "sohbet": 57.421875, "mmlu": 71.0122699386503}, "0.85": {"sohbet_vec": [1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1], "mmlu_vec": [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1], "kesik": 64, "sohbet": 56.25, "mmlu": 71.62576687116564}, "1.00": {"sohbet_vec": [0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0], "mmlu_vec": [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1], "kesik": 80, "sohbet": 46.09375, "mmlu": 71.47239263803681}} \ No newline at end of file