From e7db9cb50430b0fed77274b98df4f44a228fd7b6 Mon Sep 17 00:00:00 2001 From: Leon Derczynski Date: Fri, 5 Jul 2024 11:48:50 +0200 Subject: [PATCH 1/4] always log nvcf payload (#778) --- garak/generators/nvcf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/garak/generators/nvcf.py b/garak/generators/nvcf.py index 52db54b7d..3c1e48cf9 100644 --- a/garak/generators/nvcf.py +++ b/garak/generators/nvcf.py @@ -111,6 +111,7 @@ def _call_model( payload["seed"] = self.seed request_time = time.time() + logging.debug("nvcf : payload %s", repr(payload)) response = session.post(self.invoke_url, headers=self.headers, json=payload) while response.status_code == 202: @@ -126,7 +127,6 @@ def _call_model( if 400 <= response.status_code < 600: logging.warning("nvcf : returned error code %s", response.status_code) - logging.warning("nvcf : payload %s", repr(payload)) logging.warning("nvcf : returned error body %s", response.content) if response.status_code == 400 and prompt == "": # error messages for refusing a blank prompt are fragile and include multi-level wrapped JSON, so this catch is a little broad From 44102d6637aad6cb84f694e64d27ae0ca49637e8 Mon Sep 17 00:00:00 2001 From: Leon Derczynski Date: Fri, 5 Jul 2024 14:53:48 +0200 Subject: [PATCH 2/4] amend logic in base.Generator.generate() to hide progress bar for one generation --- garak/generators/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/garak/generators/base.py b/garak/generators/base.py index 4ec02a459..5a79d9484 100644 --- a/garak/generators/base.py +++ b/garak/generators/base.py @@ -107,7 +107,7 @@ def generate( if generations_this_call == 1: outputs = self._call_model(prompt, 1) - if self.supports_multiple_generations: + elif self.supports_multiple_generations: outputs = self._call_model(prompt, generations_this_call) else: From 18ea200e09e7392895b7a48c1200bab22c0904c9 Mon Sep 17 00:00:00 2001 From: Leon Derczynski Date: Fri, 5 Jul 2024 15:03:44 +0200 Subject: [PATCH 3/4] colour generation bar when filling up to #generations for each attempt --- garak/generators/base.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/garak/generators/base.py b/garak/generators/base.py index 5a79d9484..906870c6a 100644 --- a/garak/generators/base.py +++ b/garak/generators/base.py @@ -11,6 +11,7 @@ from garak import _config from garak.configurable import Configurable +import garak.resources.theme class Generator(Configurable): @@ -112,6 +113,7 @@ def generate( else: outputs = [] + if ( hasattr(_config.system, "parallel_requests") and _config.system.parallel_requests @@ -120,19 +122,25 @@ def generate( ): from multiprocessing import Pool - bar = tqdm.tqdm(total=generations_this_call, leave=False) - bar.set_description(self.fullname[:55]) + multi_generator_bar = tqdm.tqdm( + total=generations_this_call, + leave=False, + colour=f"#{garak.resources.theme.GENERATOR_RGB}", + ) + multi_generator_bar.set_description(self.fullname[:55]) with Pool(_config.system.parallel_requests) as pool: for result in pool.imap_unordered( self._call_model, [prompt] * generations_this_call ): outputs.append(result) - bar.update(1) + multi_generator_bar.update(1) else: generation_iterator = tqdm.tqdm( - list(range(generations_this_call)), leave=False + list(range(generations_this_call)), + leave=False, + colour=f"#{garak.resources.theme.GENERATOR_RGB}", ) generation_iterator.set_description(self.fullname[:55]) for i in generation_iterator: From e5d2458580c8c87db3aca033a6e907a049a8bdd7 Mon Sep 17 00:00:00 2001 From: Leon Derczynski Date: Fri, 5 Jul 2024 17:31:40 +0200 Subject: [PATCH 4/4] move REST generator exception into garak.exceptions (#779) --- garak/exception.py | 6 ++++++ garak/generators/rest.py | 14 +++----------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/garak/exception.py b/garak/exception.py index 4562b63e7..e694cdb04 100644 --- a/garak/exception.py +++ b/garak/exception.py @@ -30,3 +30,9 @@ class BadGeneratorException(GarakException): """Generator config/description is not usable""" pass + + +class RateLimitHit(Exception): + """Raised when a rate limiting response is returned""" + + pass diff --git a/garak/generators/rest.py b/garak/generators/rest.py index 645c8994b..f22a12110 100644 --- a/garak/generators/rest.py +++ b/garak/generators/rest.py @@ -16,16 +16,10 @@ from jsonpath_ng.exceptions import JsonPathParserError from garak import _config -from garak.exception import APIKeyMissingError +from garak.exception import APIKeyMissingError, RateLimitHit from garak.generators.base import Generator -class RESTRateLimitError(Exception): - """Raised when a rate limiting response is returned""" - - pass - - class RestGenerator(Generator): """Generic API interface for REST models @@ -247,7 +241,7 @@ def _populate_template( return output.replace("$INPUT", self.escape_function(text)) # we'll overload IOError as the rate limit exception - @backoff.on_exception(backoff.fibo, RESTRateLimitError, max_value=70) + @backoff.on_exception(backoff.fibo, RateLimitHit, max_value=70) def _call_model( self, prompt: str, generations_this_call: int = 1 ) -> List[Union[str, None]]: @@ -274,9 +268,7 @@ def _call_model( } resp = self.http_function(self.uri, **req_kArgs) if resp.status_code in self.ratelimit_codes: - raise RESTRateLimitError( - f"Rate limited: {resp.status_code} - {resp.reason}" - ) + raise RateLimitHit(f"Rate limited: {resp.status_code} - {resp.reason}") elif str(resp.status_code)[0] == "3": raise NotImplementedError(