Как изменить код метода в классе Python во время выполненияPython

Программы на Python
Ответить
Anonymous
 Как изменить код метода в классе Python во время выполнения

Сообщение Anonymous »

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

Код: Выделить всё

def patch_qwen():
import inspect
import transformers.models.qwen2.modeling_qwen2 as qwen2
replace_str = "        rotary_seq_len = kv_seq_len"
search_str = "position_ids[:, -1].max().item()"
src = inspect.getsource(qwen2.Qwen2FlashAttention2).splitlines()
print('\n'.join(src)) # first print
for i, line in enumerate(src):
if search_str in line:
# print(f"target str find {search_str} at {i}")
src[i] = replace_str
break
src = '\n'.join(src)
exec(src, qwen2.__dict__)
src = inspect.getsource(qwen2.Qwen2FlashAttention2)
print("------------------------------------------------")
print(src)# second print
результат - первый и второй отпечаток одинаковы, класс Qwen2FlashAttention2 каким-то образом не меняется.
Может ли кто-нибудь дать мне немного объяснение, почему это не работает и как решить проблему?

Подробнее здесь: https://stackoverflow.com/questions/791 ... at-runtime
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»