Indeed, thanks for the suggestion. A bit granular but works!
def get_model(model_name):
    model = timm.create_model(model_name, pretrained=True)
    model.reset_classifier(NUM_CLASSES)
    return model

model = get_model('efficientnet_b0')
for name, _ in model.named_children():
    print(name)

for param in model.parameters():
    param.requires_grad_(False)

blocks_to_retrain = 1
count = 0
for name, block in model.blocks.named_children():
    if count >= (len(model.blocks) - blocks_to_retrain):
        print(f'Unfreeze block {name}')
        for pname, params in block.named_parameters():
            if 'bn' not in pname:
                params.requires_grad = True
    else:
        print(f'Keep block {name} frozen')
    count += 1


for name, child in model.named_children():
    if name in ['conv_head', 'act2', 'global_pool', 'classifier']:
        print(f'Unfreeze block {name}')
        for params in child.parameters():
            params.requires_grad == True

Here an example of partial transfer learning