Установить свойства виджета в PySide можно не только через соответствующие методы и конструктор класса. Можно их изменять с помощью метода setProperty по имени.
btn = QPushButton("Click Me")
btn.setProperty("flat", True)
Это аналогично вызову
btn.setFlat(True)
Если указать несуществующее свойство, то оно просто создается
btn.setProperty("btnType", "super")
Получить его значение можно методом .property(name)
btn_type = btn.property("btnType")
Когда это может быть полезно?
▫️Можно просто хранить какие то данные в виджете и потом их доставать обратно
widget = QWidget()
widget.setProperty('my_data', 123)
print(widget.property('my_data'))
▫️ Назначая эти свойства разным виджетам можно потом отличить виджеты во время итераци по ним. Например, найти все кнопки со свойством my_data="superbtn".
Но ведь вместо кастомного свойства можно использовать objectName, будет тот же результат.
Да, но y ObjectName есть ограничение - только строки.
▫️ Если нам потребуется не просто поиск а, например, сортировка по числу, то свойства позволяют нам это сделать. Поддерживается любой тип данных
widget.setProperty('my_data', {'Key': 'value'})
widget.setProperty('order', 1)
all_widgets.sort(key=w: w.property('order'))
Но ведь Python позволяет всё вышеперечисленное сделать простым созданием атрибута у объекта
widget.order = 1
widget.my_data = 123
Да, но я думаю что не надо объяснять почему не стоит так делать. К тому же, если у виджета нет свойства то метод .property(name) вернет None, а отсутствующий атрибут выбросит исключение.
▫️ Действительно полезное применение кастомным свойствам - контроль стилей. Здесь атрибутами не обойтись, нужны именно свойства.
Дело в том, что в селекторах стилей можно указывать конкретные свойства виджетов на которые следует назначать стиль.
Просто запустите этот код
from PySide2.QtWidgets import *
if __name__ == "__main__":
app = QApplication([])
widget = QWidget(minimumWidth=300)
layout = QVBoxLayout(widget)
btn1 = QPushButton("Action 1")
btn2 = QPushButton("Action 2")
btn3 = QPushButton("Action 3", flat=True)
layout.addWidget(btn1)
layout.addWidget(btn2)
layout.addWidget(btn3)
# добавим кастомное свойство одной кнопке
btn1.setProperty("btnType", "super")
# добавляем стили
widget.setStyleSheet(
"""
QPushButton[btnType="super"] {
background-color: yellow;
color: red;
}
QPushButton[flat="true"] {
color: yellow;
}
"""
)
widget.show()
app.exec_()
С помощью селектора мы избирательно назначили стили на конкретные кнопки.
Как получить список всех кастомный свойств?
Функция получения списка кастомных свойств отличается от получения дефолтных.
def print_widget_dyn_properties(widget):
for prop_name in widget.dynamicPropertyNames():
property_name = prop_name.data().decode()
property_value = widget.property(property_name)
print(f"{property_name}: {property_value}")
#tricks#qt
🔥 Сенсей Карпаты выложил новый репозиторий - полный пайплайн обучения LLM с нуля
В проекте есть всё, чтобы собрать свой ChatGPT-клон за $100 и 4 часа:
> • токенизатор (написан на Rust)
> • pretraining
> • SFT (supervised fine-tuning)
> • RL (reinforcement learning)
> • оценка модели (eval)
Всего 8 000 строк кода, без лишних зависимостей - идеальный учебный пример, чтобы понять, как реально устроено обучение больших языковых моделей.
💡 Это проект из его нового грядущего курса LLM101n, и отличная возможность прокачать свои ML-навыки на практике.
Можно арендовать GPU в облаке и запустить всё самому - код уже готов к запуску.
Если запустить обучение модели nanochat на облачном GPU-сервере (например, 8×H100), то примерно через 12 часов обучения (стоимость ~300–400 $) модель достигает уровня GPT-2 по качеству на тестовых наборах (CORE-score).
А если тренировать около 40 часов (затраты ~1000 $), решает простые задачи по математике и коду, набирая:
- 40+ на MMLU
- 70+ на ARC-Easy
- 20+ на GSM8K
🧠 Это бесплатная практика топ уровня от мастера, которую не стоит упускать.
🟠GitHub:https://github.com/karpathy/nanochat
🟠Технические детали:https://github.com/karpathy/nanochat/discussions/1
@ai_machinelearning_big_data
#LLM#nanochat#MachineLearning#DeepLearning#AI#GPT
🔥 Nanochat D32 : микромодель Карпаты за $1000, которая реально работает
Карпаты написал, что завершил обучение Nanochat D32, обученной за 33 часа при бюджете $1000 (вместо $100).
Результаты - удивительно хорошие для такой «крошки»:
- 📈CORE score: 0.31 (выше, чем у GPT-2 — ~0.26)
- 🧮GSM8K: с 8% до 20%
- 🚀 Рост виден на всех этапах - pretraining, SFT и RL
Карпати пишет:
> «Не ждите от микромоделей чудес. Они обходятся $100–$1000, а не миллиарды долларов, как у крупных лабораторий.
> Разговаривать с моделью - как с ребёнком из детсада: они милые, ошибаются, путаются, галлюцинируют, но это весело.»
💡Факты:
- Nanochat тренируется с нуля
- Самая маленькая модель Nanochat содержит примерно в тысячу раз меньше параметров, чем GPT-3.
- Обнолвенный скрипт run1000.sh уже доступен в репозитории
📎 Подробности и отчёт:
https://github.com/karpathy/nanochat/discussions/8
Карпати уже тестирует веб-чат с моделью (ссылку не публикует, чтобы не обвалили сервер).
Дальше -оптимизация и возможно, переход к следующему уровню масштабирования.
#AI#LLM#Nanochat#Karpathy#AIresearch#OpenSourceAI
🧠 Карпаты показал, как добавить новую функцию в мини-LLM nanochat d32, сравнив её «мозг» с мозгом пчелы.
Он обучил модель считать, сколько раз буква r встречается в слове strawberry, и использовал этот пример, чтобы показать, как можно наделять маленькие языковые модели новыми навыками через синтетические задачи.
Сначала генерируются диалоги:
«Сколько букв r в слове strawberry?»
и правильные ответы.
После этого модель проходит дообучение (SFT) или обучение с подкреплением (RL), чтобы закрепить навык.
Карпаты объясняет, что для маленьких моделей важно продумывать всё до мелочей, как разнообразить запросы, как устроена токенизация и даже где ставить пробелы.
Он показывает, что рассуждения лучше разбивать на несколько шагов, тогда модель легче понимает задачу.
Nanochat решает задачу двумя способами:
— логически, рассуждая пошагово;
— через встроенный Python-интерпретатор, выполняя вычисления прямо внутри чата.
Идея в том, что даже крошечные LLM можно «научить думать», если правильно подготовить примеры и синтетические данные.
📘 Разбор: github.com/karpathy/nanochat/discussions/164
@ai_machinelearning_big_data
#AI#Karpathy#Nanochat#LLM#SFT#RL#MachineLearning#OpenSource