How much memory required for LLMGradientAttribution.attribute() on LLama2 tutorial?

I have an 8G NVIDIA GeForce RTX 3050 and it is able to run the LLama2 demo but only until it tries to build the LLMGradientAttribution. It then dies with torch.OutOfMemoryError: CUDA out of memory. (full trace below.). Is there a way to estimate the memory required for the LLMGradientAttribution?

Traceback (most recent call last):
File …/Llama2_LLM_Attribution.py, line 254, in
attr_res = llm_attr.attribute(inp, target=target)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File …/site-packages/captum/attr/_core/llm_attr.py, line 533, in attribute
attr = self.attr_method.attribute(
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File …/site-packages/captum/log/init.py, line 42, in wrapper
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File …/site-packages/captum/attr/_core/layer/layer_integrated_gradients.py, line 496, in attribute
attributions = self.ig.attribute.wrapped( # type: ignore
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File …/site-packages/captum/attr/_core/integrated_gradients.py, line 286, in attribute
attributions = self._attribute(
^^^^^^^^^^^^^^^^
File …/site-packages/captum/attr/_core/integrated_gradients.py, line 351, in _attribute
grads = self.gradient_func(
^^^^^^^^^^^^^^^^^^^
File …/site-packages/captum/attr/_core/layer/layer_integrated_gradients.py, line 472, in gradient_func
output = _run_forward(
^^^^^^^^^^^^^
File …/site-packages/captum/_utils/common.py, line 531, in _run_forward
output = forward_func(
^^^^^^^^^^^^^
File …/site-packages/captum/attr/_core/llm_attr.py, line 458, in _forward_func
output_logits = self.model(new_input_tensor)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File …/site-packages/torch/nn/modules/module.py, line 1553, in _wrapped_call_impl
return self._call_impl(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File …/site-packages/torch/nn/modules/module.py, line 1562, in _call_impl
return forward_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File …/site-packages/accelerate/hooks.py, line 170, in new_forward
output = module._old_forward(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File …/site-packages/transformers/models/llama/modeling_llama.py, line 1189, in forward
outputs = self.model(
^^^^^^^^^^^
File …/site-packages/torch/nn/modules/module.py, line 1553, in _wrapped_call_impl
return self._call_impl(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File …/site-packages/torch/nn/modules/module.py, line 1562, in _call_impl
return forward_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File …/site-packages/accelerate/hooks.py, line 170, in new_forward
output = module._old_forward(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File …/site-packages/transformers/models/llama/modeling_llama.py, line 1001, in forward
layer_outputs = decoder_layer(
^^^^^^^^^^^^^^
File …/site-packages/torch/nn/modules/module.py, line 1553, in _wrapped_call_impl
return self._call_impl(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File …/site-packages/torch/nn/modules/module.py, line 1562, in _call_impl
return forward_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File …/site-packages/accelerate/hooks.py, line 170, in new_forward
output = module._old_forward(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File …/site-packages/transformers/models/llama/modeling_llama.py, line 750, in forward
hidden_states = self.mlp(hidden_states)
^^^^^^^^^^^^^^^^^^^^^^^
File …/site-packages/torch/nn/modules/module.py, line 1553, in _wrapped_call_impl
return self._call_impl(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File …/site-packages/torch/nn/modules/module.py, line 1562, in _call_impl
return forward_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File …/site-packages/accelerate/hooks.py, line 170, in new_forward
output = module._old_forward(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File …/site-packages/transformers/models/llama/modeling_llama.py, line 309, in forward
down_proj = self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File …/site-packages/torch/nn/modules/module.py, line 1553, in _wrapped_call_impl
return self._call_impl(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File …/site-packages/torch/nn/modules/module.py, line 1562, in _call_impl
return forward_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File …/site-packages/accelerate/hooks.py, line 170, in new_forward
output = module._old_forward(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File …/site-packages/bitsandbytes/nn/modules.py, line 484, in forward
out = bnb.matmul_4bit(x, self.weight.t(), bias=bias, quant_state=self.weight.quant_state)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File …/site-packages/bitsandbytes/autograd/_functions.py, line 579, in matmul_4bit
return MatMul4Bit.apply(A, B, out, bias, quant_state)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File …/site-packages/torch/autograd/function.py, line 574, in apply
return super().apply(*args, **kwargs) # type: ignore[misc]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File …/site-packages/bitsandbytes/autograd/_functions.py, line 509, in forward
output = torch.nn.functional.linear(A, F.dequantize_4bit(B, quant_state).to(A.dtype).t(), bias)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
torch.OutOfMemoryError: CUDA out of memory. Tried to allocate 136.00 MiB. GPU 0 has a total capacity of 7.78 GiB of which 19.12 MiB is free. Including non-PyTorch memory, this process has 7.62 GiB memory in use. Of the allocated memory 7.34 GiB is allocated by PyTorch, and 170.50 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation. See documentation for Memory Management (CUDA semantics — PyTorch 2.5 documentation)