Являясь активным пользователем ChatGPT, а также прочитав достаточно большое количество публикаций относительно использования Opensource‑LLM, я невольно заинтересовался реальной возможностью сэкономить 20$ в месяц. Тем более, что в описании Qwen 2.5 Coder заманчиво обещается «соответствие возможностям кодирования GPT-4o», а также «сильные и всесторонние способности к кодированию». Да и сама возможность использовать LLM локально действительно привлекает внимание (я отношусь к той самой группе людей, которых Slack забанил невзирая на все VPN).

В то же время внимательный читатель обратит внимание, что упомянутое «соответствие возможностям ChatGPT» касается исключительно Qwen2.5-Coder-32B‑Instruct, модели на 32 миллиарда параметров. Являясь счастливым обладателем core i9–14 900k, 128Gb памяти и RTX 3080 Ti я лично не способен локально использовать 32B‑модель на практике. Даже 14B‑модель в квантизации Q8 уже обрабатывает запросы намного медленнее, чем я сам делаю те же действия руками. Соответственно, сегодня мы попытаемся проверить, на что действительно способен Qwen. Ориентиром будет ChatGPT, которому мы задаём следующий промпт, в котором мы попросим перевести из VB в C# древний код проверки СНИЛС, найденный на просторах сети Интернет:

Переделай из VB в c#:
            function CheckPFNumber(const Value:String):Boolean;
            var I,Summa:Integer;
            begin
              Result:=False;
              if Length(Value)<>11 then
               exit;
              for I:=1 to 11 do
               if not (Value[I] in ['0'..'9']) then
                exit;
              Summa:=0;
              for I:=1 to 9 do
               Inc(Summa,StrToInt(Value[I])*(10-I)); // вычисляем контрольную сумму
              Result:=StrToInt(Copy(Value,10,2))=(Summa mod 101); // проверяем остаток от деления контрольной суммы на 101 с двумя последними числам
            end;

Несмотря на внешнюю тривиальность задачи, в ней есть серьёзный подвох для LLM - вычисление контрольной суммы производится в цикле от 1 до 9, а при переходе на c# нумерация сменится и начнётся с нуля, соответственно, придётся отредактировать формулу. Человек Грамотный программист должен это увидеть и исправить.

Вот вывод ChatGPT:

using System;

class Program
{
    public static bool CheckPFNumber(string value)
    {
        if (value.Length != 11)
            return false;

        if (!long.TryParse(value, out _))
            return false;

        int summa = 0;
        for (int i = 0; i < 9; i++)
        {
            summa += int.Parse(value[i].ToString()) * (10 - i);
        }

        int controlSum = int.Parse(value.Substring(9, 2));
        return controlSum == (summa % 101);
    }
}

Не будем придираться к использованию int.Parse, в конце концов, мы даже не просили оптимизировать код. Важно, что при первом подходе даже ChatGPT не в состоянии увидеть произошедшее искажение логики (10 - i уже не работает) . Но может ли он хотя бы исправить ошибку? Новый промпт:

Проверь соответствие CheckPFNumber следующему алгоритму: Контрольное число Страхового номера рассчитывается следующим образом:
- каждая цифра Страхового номера умножается на номер своей позиции (позиции отсчитываются с конца)
- полученные произведения суммируются
- сумма делится на 101
- последние две цифры остатка от деления являются Контрольным числом.

что мы получаем в выводе:

Алгоритм в функции CheckPFNumber в текущем виде не соответствует описанному алгоритму расчета контрольного числа Страхового номера.

Проблемы:

  1. В текущей реализации каждая цифра умножается на 10 - i, где i — позиция цифры (считая с начала строки). Это не соответствует описанным требованиям, где позиции отсчитываются с конца.

  2. Остаток от деления на 101 действительно используется, но результат напрямую сравнивается с двумя последними цифрами номера. Однако, в описанном алгоритме контрольное число — это именно последние две цифры остатка от деления суммы на 101.

    Исправленная реализация CheckPFNumber:

     static bool CheckPFNumber(string value)
    {
        if (value.Length != 11 || !value.All(char.IsDigit))
            return false;
    
        int summa = 0;
        for (int i = 0; i < 9; i++)
        {
            int digit = value[i] - '0';
            int position = 9 - i; // Позиция цифры с конца
            summa += digit * position;
        }
    
        int remainder = summa % 101;
        int controlSum = (value[9] - '0') * 10 + (value[10] - '0'); // Две последние цифры как число
    
        return remainder == controlSum;
    }
    

Отличия:

  1. Позиции для умножения берутся с конца: position = 9 - i.

  2. Остаток от деления (remainder) используется для сравнения с последними двумя цифрами номера.

  3. Логика полностью соответствует описанному алгоритму.

Итак, ChatGPT нашёл ошибку и поправил её.

Теперь то же самое я попытался проверить на нескольких моделях Qwen - qwen2.5-coder-3b-instruct-q8_0, qwen2.5-coder-14b-instruct-q5_k_m, qwen2.5-coder-14b-instruct-q8_0, qwen2.5-coder-32b-instruct-q4_0, qwen2.5-coder-32b-instruct-q5_k_m. Для чистоты эксперимента также зададим вопрос Qwen2.5-72B-instruct. Она не специализирована для кодирования, но число параметров позволяет ей делать довольно глубокие выводы, и она свободно доступна (https://huggingface.co/spaces/Qwen/Qwen2.5).

Буду краток. Qwen2.5-coder-3b-instruct-q8_0 ожидаемо не годен. 3 миллиарда параметров просто мало. Вот вывод на первый промпт:

public static bool CheckPFNumber(string value)
    {
        if (value.Length != 11) return false;

        foreach (char c in value)
        {
            if (!"0123456789".Contains(c)) return false;
        }

        int summa = 0;
        for (int i = 1; i <= 9; i++)
        {
            summa += Convert.ToInt32(value[i]) * (10 - i);
        }

        return Convert.ToInt32(value[9].ToString() + value[10].ToString()) == (summa % 101);
    }

Вот после уточнения. В некотором смысле, 3B-модель даже ухудшает ситуацию каждый раз, когда ты пытаешься её направить в верном направлении. Мозгов не хватает:

public static bool CheckPFNumber(string value)
{
    if (value.Length != 11) return false;

    foreach (char c in value)
    {
        if (!"0123456789".Contains(c)) return false;
    }

    int summa = 0;
    for (int i = 1; i <= 11; i++) // Pозиции отсчитываются с конца, поэтому начинаем с 1
    {
        summa += Convert.ToInt32(value[11 - i]) * i; // Используем [11 - i] для обратного порядка
    }

    return (summa % 101) == 0;
}

Qwen2.5-coder-14b-instruct-q5_k_m. Уже 14B параметров, и квантизация Q5_k_m позволяет хоть как-то пытаться её реально использовать. Вот вывод:

public bool CheckPFNumber(string value)
{
    if (value.Length != 11) return false;
    for (int i = 0; i < value.Length; i++)
    {
        if (!char.IsDigit(value[i]))
            return false;
    }
    
    int summa = 0;
    for (int i = 0; i < 9; i++)
    {
        summa += (value[i] - '0') * (10 - i); // вычисляем контрольную сумму
    }

    int controlNumber = int.Parse(value.Substring(8, 2));
    return controlNumber == (summa % 101);
}

Приятно, что модель умеет в "value[i] - '0'". Однако формула все равно побита. И попытка найти проблему анализом оригинального алгоритма:

Да, ваш алгоритм полностью соответствует реализации метода CheckPFNumber. Давайте разберем шаги:

  1. Умножение каждой цифры на номер своей позиции (отсчитываются с конца):

    • Для каждого символа от 0 до 8 включительно (i от 0 до 8), он умножается на (10 - i).

  2. Суммирование произведений:

    • Сумма всех произведений сохраняется в переменной summa.

  3. Расчет контрольного числа:

    • Контрольное число вычисляется как остаток от деления summa на 101, а затем берутся последние две цифры этого остатка.

  4. Проверка соответствия:

    • Полученное контрольное число сравнивается с двумя последними символами входной строки value.

Ну, хотя бы не портит. Для очистки совести я попытался использовать ту же модель, но с квантизацией Q8. Понятно, что квантизация влияет на результат заметно меньше, чем число параметров, но вдруг? Не буду загромождать текст, результат был тот же. Текста было чуть больше, но принципиально ничего не изменилось, спишем разницу на рандомность seed.

Модель с 32B параметров я даже не стал пытаться использовать с Q8. На моем железе даже Q5_k_m время между промптом и получением ответа позволяет спокойно пойти покушать, потом погулять, потом увидеть, что ответ ещё формируется. Но вот предсказуемый результат первого запроса:

public static bool CheckPFNumber(string value)
    {
        if (value.Length != 11)
            return false;
        
        for (int i = 0; i < 11; i++)
        {
            if (!char.IsDigit(value[i]))
                return false;
        }

        int summa = 0;
        for (int i = 0; i < 9; i++)
        {
            summa += (value[i] - '0') * (10 - i); // вычисляем контрольную сумму
        }
        
        int checkSum = int.Parse(value.Substring(9, 2)); // последние два символа
        return checkSum == (summa % 101);
    }

А вот второго:

public static bool CheckPFNumber(string value)
    {
        if (value.Length != 11)
            return false;
        
        for (int i = 0; i < 11; i++)
        {
            if (!char.IsDigit(value[i]))
                return false;
        }

        int summa = 0;
        for (int i = 0; i < 9; i++)
        {
            // Умножаем каждую цифру на её позицию, отсчитываемую с конца
            summa += (value[i] - '0') * (9 - i);
        }

        int remainder = summa % 101;
        string controlNumberFromValue = value.Substring(9, 2); // последние две цифры Страхового номера
        string calculatedControlNumber = remainder.ToString("D2"); // формируем контрольное число из остатка

        return controlNumberFromValue == calculatedControlNumber;
    }

Итак 32B параметров действительно справляются с задачей! Qwen 2.5 Coder вычисляет контрольную сумму первых 9 цифр по формуле (value[i] - '0') * (9 - i)! Начало строки наконец-то нашлось, пусть и не с первого промпта, но не хуже, чем ChatGPT.

Однако сэкономить 20$ мы все ещё не можем, модель работает нереально медленно. RTX 5090 мы купим чуть позднее, а пока, может быть, попробовать Q4?

С первым промптом немного лоботомированная qwen2.5-coder-32b-instruct-q4_0 справляется не сильно хуже и заметно быстрее.

public static bool CheckPFNumber(string value)
    {
        if (value.Length != 11)
            return false;

        for (int i = 0; i < 11; i++)
            if (!char.IsDigit(value[i]))
                return false;

        int summa = 0;
        for (int i = 0; i < 9; i++)
            summa += (value[i] - '0') * (10 - i); // вычисляем контрольную сумму

        return Convert.ToInt32(value.Substring(9, 2)) == (summa % 101); // проверяем остаток от деления контрольной суммы на 101 с двумя последними числами
    }

А вот попытка исправить решение...

        public static bool CheckPFNumber(string value)
        {
            if (value.Length != 11)
                return false;

            for (int i = 0; i < 11; i++)
                if (!char.IsDigit(value[i]))
                    return false;

            int summa = 0;
            for (int i = 0; i < 9; i++)
                summa += (value[8 - i] - '0') * (i + 1); // умножаем каждую цифру на номер своей позиции, отсчитываемый с конца

            int controlNumber = summa % 101; // остаток от деления суммы на 101
            string expectedControlNumber = controlNumber.ToString("D2"); // последние две цифры контрольного числа

            return value.Substring(9, 2) == expectedControlNumber; // сравниваем с двумя последними цифрами Страхового номера
        }

Немного неожиданно, да? Но я проверил, summa += (value[8 - i] - '0') * (i + 1) работает, хотя до меня не сразу дошло почему. Честно говоря, для меня Qwen 2.5 coder даже на Q4 все равно катастрофически медленный. Но опускать квантизацию ещё ниже я уже не рискнул. Решения модели даже на Q4 становятся слишком странными. Она ощущается лоботомированной в прямом смысле.

Попробуем подойти к задаче с другой стороны? Qwen 2.5 Coder заточена на большом количестве кода и медленна сама по себе. Huggingface онлайн позволяет её использовать в вариации не более 7B (https://huggingface.co/spaces/Qwen/Qwen2.5). В то же время просто Qwen2.5-72B-instruct вполне доступен онлайн тут же, работает терпимо шустро. Но что могут 72B без специализированного coder натаскивания? Итак, ответ на первый промпт:

    public static bool CheckPFNumber(string value)
    {
        if (value.Length != 11)
        {
            return false;
        }

        for (int i = 0; i < 11; i++)
        {
            if (value[i] < '0' || value[i] > '9')
            {
                return false;
            }
        }

        int summa = 0;
        for (int i = 0; i < 9; i++)
        {
            summa += (value[i] - '0') * (10 - i); // Вычисляем контрольную сумму
        }

        int lastTwoDigits = int.Parse(value.Substring(9, 2));
        return lastTwoDigits == (summa % 101); // Проверяем остаток от деления контрольной суммы на 101 с двумя последними числами
    }

Что мы видим? Неспециализированная модель не умеет в isDigit, что в данном случае даже плюс. Уж если наводить красоту в коде, то value.All(char.IsDigit) вам в помощь. А так и читаемо, и не громоздко. Но базовая ошибка логики на месте. Ответ на второй промпт:

public static bool CheckPFNumber(string value)
    {
        if (value.Length != 11)
        {
            return false;
        }

        for (int i = 0; i < 11; i++)
        {
            if (value[i] < '0' || value[i] > '9')
            {
                return false;
            }
        }

        int summa = 0;
        for (int i = 0; i < 11; i++)
        {
            summa += (value[i] - '0') * (11 - i); // Умножаем каждую цифру на её позицию, отсчитывая с конца
        }

        int remainder = summa % 101;
        int lastTwoDigits = remainder < 10 ? remainder : remainder % 100;

        int expectedLastTwoDigits = int.Parse(value.Substring(9, 2));
        return expectedLastTwoDigits == lastTwoDigits; // Проверяем, совпадают ли последние две цифры остатка с контрольным числом
    }
}

Увы. Не-Coder 72B делает такую же ошибку, как и Coder 3B. Недостаток обучающего материала даёт себя знать.

Перейдём к выводам?

Итак, даже потратив довольно существенные денежные средства на вполне актуальную на январь 2025 года рабочую станцию, сэкономить двадцатку на ChatGPT нам пока не светит. По крайней мере путём использования локального AI-ассистента.

Ждём RTX 5090? Новый Ryzen у меня уже есть, попробуем дадут ли что-нибудь 32 Гб памяти на ускорителе.

Комментарии (32)


  1. datacompboy
    15.01.2025 18:11

    Клавдия тоже не справилась. И после исправлений становилось хуже. Несколько раз на ушибки указывал пока не исправилась :)


  1. IgorRJ
    15.01.2025 18:11

    Удивительно, что он вообще понял уточняющий промпт, поскольку он составлен некорректно. По сути, промпт говорит,

    - каждая цифра Страхового номера умножается на номер своей позиции (позиции отсчитываются с конца)

    - полученные произведения суммируются

    что используются ВСЕ цифры (т. е. 11 штук). И тогда результат должен быть другим. Однако же, машинка не повелась на провокацию.


    1. datacompboy
      15.01.2025 18:11

      С третьего уточнения до них доходит, что контрольная сумма не участвует. Сам не догадывается


    1. pizhonkov Автор
      15.01.2025 18:11

      Взят из документов ПФР. Максимально близко к тому, что сделает пользователь - найдёт описание в соответствующем постановлении, скопирует, вставит.


  1. gybson_63
    15.01.2025 18:11

    AI-муннизм на отдельно взятом компе? И не мечтайте.


    1. gybson_63
      15.01.2025 18:11

      Какая-то сеть свободных вычислений независимых разработчиков - да. Отдельная машина - нет.


  1. eeglab
    15.01.2025 18:11

    Qwen2.5-Coder-32B‑Instruct вполне доступна сейчас на оф. сайте Qwen


    1. pizhonkov Автор
      15.01.2025 18:11

      Вот, кстати не знал. Интересно, какая квантизация, потому что выдал вот что после уточнения:

          int summa = 0;
          for (int i = 0; i &lt; 9; i++)
          {
              summa += (value[i] - '0') * (9 - i + 1); // Позиции отсчитываются с конца
          }

      Неправильно.


  1. gfiopl8
    15.01.2025 18:11

    Мистраль дает бесплатно 500.000 токенов в минуту и 1млрд в месяц. https://console.mistral.ai/limits/

    Если средний запрос весит 20т токенов то это примерно 25 в минуту и 50000 в месяц.

    У них есть большая модель заточенная под код - codestral.

    С перекладыванием байтиков (парсинг например) с места на место они по-моему все плохо справляются.


    1. pizhonkov Автор
      15.01.2025 18:11

      Если кто-то, у кого есть оплаченный доступ, может протестировать - будьте добры.


      1. molnij
        15.01.2025 18:11

        Там не нужен оплаченый доступ, модель просто доступна бесплатно на сайте по регистрации, ну и веса как обычно на HF. Кстати в отличие от очень многих других, даже телефон не требует при регистрации.

        Основная модель справилась сразу насколько могу судить: https://chat.mistral.ai/chat/ff0626be-b8ed-424e-9c86-f708cf83754f

        (и даже распознала что это за алгоритм)
        (и даже распознала что это за алгоритм)

        Не исключаю, что в обучающей выборке было. Не смог вспомнить сходу где у них переключение моделей в веб-интерфейсе, если не забуду, вечером попробую именно на codestral запустить

        И уточните пожалуйста, вот тот насыщенный оборот про покушать\погулять и т.п. - сколько времени занимает на самом деле? Он меня слегка удивил, поскольку 32B-модель на вашем железе должна даже неквантизованной весьма оперативно отвечать. Возможно не 100500т\с, но я бы точно на один ответ покушать не успел бы. Покушать - это как раз 123B mistral без квантов, запущенная в RAM - там 5-15 минут на ответ уходит.


  1. Killan50
    15.01.2025 18:11

    Периодически локально использую Qwen2.5-Coder-32B-Instruct в четвертом кванте для рефакторинга, в сравнении с Q5 прям особой разницы не заметил, но благодаря меньшему весу в тот же объём vram помещается больше контекста.

    Надо понимать что ответы любой LLM очень "недетерминированы", сейчас она ответила верно, но при следующем свайпе напишет чушь, и наоборот. Реальную потерю интеллекта можно отследить только многократной проверкой и тестами отклонения токенов в сравнении с неквантованной моделью.

    Я видел много тестирований, в среднем у ~30b моделей отклонения от эталона выглядят следующим образом:

    (все очень примерно)

    q6_K: ~1%
    q5_K_M: 2-3%
    q4_K_M: 4-6%
    q3_K_M: 20-30%

    Чем жирнее модель тем меньше потери. 70b модели почти не теряют мозги даже на q3, и наоборот, 12b тупеют почти на 10% уже на q4.


  1. cry_san
    15.01.2025 18:11

    1. pizhonkov Автор
      15.01.2025 18:11

      После событий 2022 года переход на self-host воспринимается уже не как паранойя, а как обязательный комплекс мероприятий. dropbox -> nextcloud e.t.c...


  1. FurryMileon
    15.01.2025 18:11

    Автор, умоляю тебя, попробуй claude 3.5 sonnet он очень хорошо кодит и сравни его пж в своих тестах. Я думаю тебе понравится его результат.


    1. pizhonkov Автор
      15.01.2025 18:11

      Первый комментарий про claude, но посмотрю сам


    1. datacompboy
      15.01.2025 18:11

      я в качестве хоббита пытаюсь в последнее время крафтить то одно то другое используя сетки. клавдия отнюдь не жжот: ровно так же врёт как другие, пытается сделать то, что невозможно с уверенностью и доказывая, что всё хорошо... :) в общем, благо я делаю вещи которые мне не жаль в mit отдать -- так что thumbs down я жму там постоянно...

      o1 мне как-то показала два варианта абсолютно неправильных ответов с разным количеством галлюцинаций в каждом -- и спросила, а какой лучше?... ответа "оба отстой" не нашёл.

      gemini пока мой фав -- в состоянии иногда сказать что запутался и не получается, где другие в ответ на указание ошибки начинают ходить по кругу...


  1. riv9231
    15.01.2025 18:11

    Уверен, что логика экономии как основание для использования открытых моделей в программировании не работает сейчас, а в будущем не будет работать вовсе. 32B-модели можно запускать q8_0 на 2x3090 - это 120 000 рублей по низу бу рынка. За эти деньги сейчас можно на всю оставшуюся жизнь купить токенов для deepseek-v3 670B. Жаль, что аттракцион невиданной щедрости, наверняка не вечен. Просо ради интереса, для запуска DeepSeek V3 нужно 30шт RTX3090, а это 2 000 000, если рассчитывать на бу-ускорители.

    Тем, не менее, меня очень воодушевляет наличие моделей с отрытыми весами и по своей работе я пользуюсь из принципиальных соображений только открытыми моделями, даже если использую их через api. Уж если платить за ИИ, то тем, кто выпускает модели открыто, поддерживая их деньгами. И, как я думаю, сами запросы представляют из себя отдельную ценность для провайдера, так как позволяют оценить наиболее востребованные сценарии использования модели, а так-же вычислить моменты когда модель не справляется с задачами, ориентируясь на перегенерации.

    Я все же купил пару rtx 3090 и с qwen даже 72B q8_0 (в режиме оффлоада на процессор) проблем с производительностью нет. Но вот развернуть инфраструктуру для deepseek я уже не смогу, да и не имеет экономического смысла, даже если цены на использование модели вырастут в 10 раз.


    1. pizhonkov Автор
      15.01.2025 18:11

      Уже писал сверху в комментариях - это логика selfhosted, а она не про экономию, на самом деле. 20$ - это, конечно, маленький кликбейт, сознаюсь.


  1. trix
    15.01.2025 18:11

    1) не все языки программирования одинаково хорошо представлены в моделях, чем меньше размер модели, тем хуже она пишет на чем-то отличающемся от питона.
    2) квен не обучался специально для обработки русского языка, запросы на ангийском обычно дают более качественный результат
    3) для быстрой работы qwen-32b достаточно одной Nvidia 3090 со вторичного рынка, разницы между q5 и q8 вы, скорее всего, не заметите.

    4) если модель не входит в GPU и переливается в обычную память, пробуйте запуск с драфт моделью, обычно это даёт 30-40% пророста к скорости (читать про speculative decoding)


    1. headliner1985
      15.01.2025 18:11

      Подскажите, может вы в курсе: что лучше использовать для java? Где лучшие модели?


      1. trix
        15.01.2025 18:11

        Из того что можно запускать на типичных домашних GPU выбор пока что только между deepseek-coder-33b и qwen2.5-coder-32b, специально для явы никто модели не обучает, но в целом они справляются, вполне могут за вас тесты написать или родить что-то по внятному описанию, более мелкие модели можно использовать в режиме "подсказка одной строки" или "подсказка фрагмента", но их польза ограниченна.
        Хорошая модель в облаке для вопросов по коду - https://chat.deepseek.com/ цены на доступ через API там тоже очень низкие, но наверное могут быть сложности с оплатой.


        1. datacompboy
          15.01.2025 18:11

          deepseek сконвертировал с первого раза правильно, на первый взгляд:

          using System;
          
          public class PFNumberChecker
          {
              public static bool CheckPFNumber(string value)
              {
                  if (value.Length != 11)
                      return false;
          
                  foreach (char c in value)
                  {
                      if (!char.IsDigit(c))
                          return false;
                  }
          
                  int summa = 0;
                  for (int i = 0; i < 9; i++)
                  {
                      summa += int.Parse(value[i].ToString()) * (10 - (i + 1));
                  }
          
                  int lastTwoDigits = int.Parse(value.Substring(9, 2));
                  return lastTwoDigits == (summa % 101);
              }
          }
          

          спасибо, поэкспериментирую с ним :)


          1. datacompboy
            15.01.2025 18:11

            хм. а это точно не ChatGPT ? Возможно, с лёгким промптингом, но в целом -- ответы почти 1-в-1 с чгпт...


            1. trix
              15.01.2025 18:11

              Вас обманули. Вам дали гораздо лучший мех. Это шанхайские барсы. Ну да! Барсы! Я узнаю их по оттенку (с)


  1. 9241304
    15.01.2025 18:11

    Судя по всему, кожаные мешки пока в безопасности. ИИ на данном этапе может не забрать, а подкинуть работы )

    Но всё же интересно, как на практике ИИ справляется с переписыванием небольших (по современным меркам) проектов и внесением правок в существующий код в связи с новыми фичами или хотя бы рефакторингом. Есть такие примеры?


    1. datacompboy
      15.01.2025 18:11

      с "переписыванием" плохо. с правками -- через кожаного мешка с такой-то матерью. новые фичи добавлять проще, но получается очень лоскутное одеяло, так как подряд две фичи может советовать добавлять с разными стилями форматирования - названия файлов - организации кода - и так далее.

      если просто молча соглашаться с тем, что он говорит -- уже к третьей фиче у него самого едет крыша :D


      1. 9241304
        15.01.2025 18:11

        <кожаный мешок выдохнул>

        Спасибо за подтверждение предположений



  1. timur__timur
    15.01.2025 18:11

    А я использую gemma2 (9b) + ollama часто . На макбуке с м2 про и 32гб работает около 30 токенов в секунду, и часто результат вполне приемлемый. Для рутины - написать тесты, что-то быстро сгенерировать - вполне хватает.


  1. FirstBlood
    15.01.2025 18:11

    Ура, в интернете опять кто-то не прав очередной срыв покровов. Первое и самое главное: запросы/промпт на русском языке? Если да - спасибо большое за тесты, можете их выкидывать.

    На qwen данные закрыты, даже описания данных нет, так что мы не знаем как именно файнтюнили instruct, но предположительно на английском и китайском, и попугаев меряют на английском. Ожидать от него self-repair на русском... ну да, оно может ответить вам что-то на русском, иногда даже чудом сработать. Но именно такие "случайно оказавшиеся" или "случайно оставшиеся" знания очень быстро отмирают при любом квантовании.

    Однако сэкономить 20$ мы все ещё не можем, модель работает нереально медленно. RTX 5090 мы купим чуть позднее

    А может быть, чтобы сэкономить, нужно уметь пользоваться гуглом? https://deepinfra.com/Qwen/Qwen2.5-Coder-32B-Instruct Вот она же за $0.16/1M, что при использовании в режиме чата во много десятков раз дешевле, чем $20 в месяц. Я лично пока на $1 ещё наскрести не смог. Да даже API к GPT-4o-mini стоит $0.60/1M, хотя по попугаям уступает. А ведь есть бесплатный доступ к Mistral, а ведь есть бесплатный доступ к Gemini, а ведь есть временно почти бесплатный DeepSeek-V3.

    В общем, локально смысл есть запускать только маленькие модели для автокомплита или "умных" подсказок под табуляцией. Тут и latency минимальная нужна, а до видеокарты пинг нулевой и очереди нет, и токены улетают очень уж быстро при таком варианте использования, так что локально может оказаться правда дешевле, да и условных 3b-base или 7b-base достаточно, поэтому карточка уровня 3080ti и перформанс обеспечит, и под контекст запас останется.

    Ну и в-третьих, Qwen2.5-coder-32b - это весьма капризная модель. Китайцы похоже тюнили её до посинения, поэтому она сильнее других тупеет даже при небольшом квантовании, о чём ещё давно были посты на r/LocalLLaMA. Ну и плюс нужны точные параметры токенайзеров: https://huggingface.co/Qwen/Qwen2.5-Coder-32B-Instruct/blob/main/generation_config.json

    Так что да, opensource - это часто не про "бесплатно сел и поехал". Часто или всегда.


    1. pizhonkov Автор
      15.01.2025 18:11

      Мне нравится, что все читают заголовок, код и игнорируют весь остальной текст. Мои мысли никому не важны, чтд :)
      На всякий случай повторю, раз из текста это не понятно - очевидным образом я и не надеялся на экономию в 20$ просто потому, что она не существенна. Кликбейт. Маленький грех для автора статьи. Но я серьёзно перехожу на selfhosted решения и к поиску LLM отношусь в этой ситуации серьезно.
      Насчёт промптов на русском - второй промпт не может быть на английском по очевидным причинам.