arbor-ai 0.2.1__py3-none-any.whl → 0.2.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. arbor/__init__.py +17 -0
  2. arbor/cli.py +83 -43
  3. arbor/client/arbor_client.py +259 -0
  4. arbor/server/api/models/schemas.py +3 -1
  5. arbor/server/api/routes/grpo.py +2 -6
  6. arbor/server/api/routes/inference.py +7 -3
  7. arbor/server/core/config.py +293 -7
  8. arbor/server/core/config_manager.py +100 -0
  9. arbor/server/main.py +26 -1
  10. arbor/server/services/comms/comms.py +13 -9
  11. arbor/server/services/file_manager.py +7 -4
  12. arbor/server/services/grpo_manager.py +98 -62
  13. arbor/server/services/health_manager.py +171 -0
  14. arbor/server/services/inference/vllm_client.py +6 -4
  15. arbor/server/services/inference_manager.py +40 -38
  16. arbor/server/services/job_manager.py +2 -2
  17. arbor/server/services/scripts/grpo_training.py +62 -281
  18. arbor/server/services/scripts/mmgrpo_training.py +510 -0
  19. arbor/server/services/scripts/sft_training.py +8 -5
  20. arbor/server/services/scripts/utils/callbacks.py +33 -0
  21. arbor/server/services/scripts/utils/comms_monitors.py +169 -0
  22. arbor/server/services/scripts/utils/dataset.py +176 -0
  23. arbor/server/services/scripts/utils/ingestion_monitor.py +35 -0
  24. arbor/server/services/scripts/utils/mock_server.py +124 -0
  25. arbor/server/services/training_manager.py +4 -4
  26. arbor/server/utils/logging.py +298 -0
  27. {arbor_ai-0.2.1.dist-info → arbor_ai-0.2.2.dist-info}/METADATA +8 -18
  28. arbor_ai-0.2.2.dist-info/RECORD +51 -0
  29. arbor_ai-0.2.1.dist-info/RECORD +0 -42
  30. {arbor_ai-0.2.1.dist-info → arbor_ai-0.2.2.dist-info}/WHEEL +0 -0
  31. {arbor_ai-0.2.1.dist-info → arbor_ai-0.2.2.dist-info}/entry_points.txt +0 -0
  32. {arbor_ai-0.2.1.dist-info → arbor_ai-0.2.2.dist-info}/licenses/LICENSE +0 -0
  33. {arbor_ai-0.2.1.dist-info → arbor_ai-0.2.2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,298 @@
1
+ """
2
+ Logging configuration for Arbor.
3
+ Provides centralized logging setup with file and console handlers.
4
+ """
5
+
6
+ import logging
7
+ import logging.config
8
+ import sys
9
+ from pathlib import Path
10
+ from typing import Any, Dict, Optional
11
+
12
+
13
+ class ColoredFormatter(logging.Formatter):
14
+ """Custom formatter with colors for console output."""
15
+
16
+ # ANSI color codes
17
+ COLORS = {
18
+ "DEBUG": "\033[36m", # Cyan
19
+ "INFO": "\033[32m", # Green
20
+ "WARNING": "\033[33m", # Yellow
21
+ "ERROR": "\033[31m", # Red
22
+ "CRITICAL": "\033[35m", # Magenta
23
+ "RESET": "\033[0m", # Reset
24
+ }
25
+
26
+ def format(self, record):
27
+ # Use the name mapping to get short names, fallback to original name
28
+ name_mappings = {
29
+ "arbor.server.services.inference_manager": "infer",
30
+ "arbor.server.services.grpo_manager": "grpo",
31
+ "arbor.server.services.file_manager": "files",
32
+ "arbor.server.services.health_manager": "health",
33
+ "arbor.server.services.job_manager": "jobs",
34
+ "arbor.server.services.training_manager": "train",
35
+ "arbor.server.services.comms.comms": "comms",
36
+ "arbor.server.services.scripts.sft_training": "sft",
37
+ "arbor.server.services.scripts.grpo_training": "grpo",
38
+ "arbor.config": "config",
39
+ "arbor.cli": "cli",
40
+ "__main__": "main",
41
+ # Add uvicorn loggers
42
+ "uvicorn": "api",
43
+ "uvicorn.access": "api",
44
+ "uvicorn.error": "api",
45
+ }
46
+
47
+ # Get short name if available, otherwise use the provided name
48
+ short_name = name_mappings.get(record.name, record.name)
49
+ name = short_name.upper()
50
+ record.name = f"[{name}]".rjust(
51
+ 8
52
+ ) # Right-align the whole bracketed name (8 chars max)
53
+
54
+ # Store original level name for color lookup
55
+ original_level = record.levelname
56
+
57
+ # Convert level names to 4-character abbreviations
58
+ level_abbreviations = {
59
+ "DEBUG": "DEBG",
60
+ "INFO": "INFO",
61
+ "WARNING": "WARN",
62
+ "ERROR": "ERRO",
63
+ "CRITICAL": "CRIT",
64
+ }
65
+
66
+ # Get abbreviated level name and add brackets with padding
67
+ abbreviated_level = level_abbreviations.get(original_level, original_level[:4])
68
+ record.levelname = f"[{abbreviated_level}]"
69
+
70
+ # Add color to the bracketed level name
71
+ if original_level in self.COLORS:
72
+ record.levelname = (
73
+ f"{self.COLORS[original_level]}{record.levelname}{self.COLORS['RESET']}"
74
+ )
75
+
76
+ return super().format(record)
77
+
78
+
79
+ def setup_logging(
80
+ log_level: str = "INFO",
81
+ log_dir: Optional[Path] = None,
82
+ enable_file_logging: bool = True,
83
+ enable_console_logging: bool = True,
84
+ log_format: Optional[str] = None,
85
+ ) -> Dict[str, Any]:
86
+ """
87
+ Setup logging configuration for Arbor.
88
+
89
+ Args:
90
+ log_level: Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
91
+ log_dir: Directory for log files
92
+ enable_file_logging: Whether to enable file logging
93
+ enable_console_logging: Whether to enable console logging
94
+ log_format: Custom log format string
95
+
96
+ Returns:
97
+ Dictionary with logging configuration details
98
+ """
99
+
100
+ # Default log format
101
+ if log_format is None:
102
+ log_format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
103
+
104
+ # Console format with colors and tight alignment
105
+ console_format = "%(name)s - %(levelname)s - %(message)s"
106
+
107
+ # Create formatters
108
+ file_formatter = logging.Formatter(log_format)
109
+ console_formatter = ColoredFormatter(console_format)
110
+
111
+ # Get root logger
112
+ root_logger = logging.getLogger()
113
+ root_logger.setLevel(getattr(logging, log_level.upper()))
114
+
115
+ # Clear existing handlers
116
+ root_logger.handlers.clear()
117
+
118
+ handlers = []
119
+
120
+ # Console handler
121
+ if enable_console_logging:
122
+ console_handler = logging.StreamHandler(sys.stdout)
123
+ console_handler.setLevel(getattr(logging, log_level.upper()))
124
+ console_handler.setFormatter(console_formatter)
125
+ root_logger.addHandler(console_handler)
126
+ handlers.append("console")
127
+
128
+ # File handlers
129
+ if enable_file_logging and log_dir:
130
+ log_dir = Path(log_dir)
131
+ log_dir.mkdir(parents=True, exist_ok=True)
132
+
133
+ # Main log file (all levels)
134
+ main_log_file = log_dir / "arbor.log"
135
+ file_handler = logging.FileHandler(main_log_file)
136
+ file_handler.setLevel(logging.DEBUG) # Capture all levels in file
137
+ file_handler.setFormatter(file_formatter)
138
+ root_logger.addHandler(file_handler)
139
+ handlers.append("file")
140
+
141
+ # Error log file (errors and critical only)
142
+ error_log_file = log_dir / "arbor_error.log"
143
+ error_handler = logging.FileHandler(error_log_file)
144
+ error_handler.setLevel(logging.ERROR)
145
+ error_handler.setFormatter(file_formatter)
146
+ root_logger.addHandler(error_handler)
147
+ handlers.append("error_file")
148
+
149
+ # Configure specific loggers for different components
150
+ configure_component_loggers(log_level)
151
+
152
+ return {
153
+ "level": log_level,
154
+ "handlers": handlers,
155
+ "log_dir": str(log_dir) if log_dir else None,
156
+ "main_log_file": str(log_dir / "arbor.log") if log_dir else None,
157
+ "error_log_file": str(log_dir / "arbor_error.log") if log_dir else None,
158
+ }
159
+
160
+
161
+ def configure_component_loggers(log_level: str):
162
+ """Configure loggers for specific Arbor components."""
163
+
164
+ # Arbor component loggers with shorter names (8 chars max for proper centering)
165
+ component_loggers = {
166
+ "arbor.server.services.inference_manager": "infer",
167
+ "arbor.server.services.grpo_manager": "grpo",
168
+ "arbor.server.services.file_manager": "files",
169
+ "arbor.server.services.health_manager": "health",
170
+ "arbor.server.services.job_manager": "jobs",
171
+ "arbor.server.services.training_manager": "train",
172
+ "arbor.server.services.comms": "comms",
173
+ "arbor.server.services.scripts.sft_training": "sft",
174
+ "arbor.server.services.scripts.grpo_training": "grpo",
175
+ "arbor.config": "config",
176
+ "arbor.cli": "cli",
177
+ "__main__": "main",
178
+ }
179
+
180
+ # Create shorter logger aliases
181
+ for full_name, short_name in component_loggers.items():
182
+ # Set up the short name logger to use the same handlers as root
183
+ short_logger = logging.getLogger(short_name)
184
+ short_logger.setLevel(getattr(logging, log_level.upper()))
185
+
186
+ # Also configure the full name for backward compatibility
187
+ full_logger = logging.getLogger(full_name)
188
+ full_logger.setLevel(getattr(logging, log_level.upper()))
189
+
190
+ # Third-party library loggers (usually more verbose)
191
+ third_party_loggers = {
192
+ "uvicorn": "WARNING",
193
+ "uvicorn.access": "WARNING",
194
+ "uvicorn.error": "WARNING",
195
+ "fastapi": "WARNING",
196
+ "httpx": "WARNING",
197
+ "urllib3": "WARNING",
198
+ "vllm": "INFO",
199
+ "torch": "WARNING",
200
+ "transformers": "WARNING",
201
+ }
202
+
203
+ for logger_name, level in third_party_loggers.items():
204
+ logger = logging.getLogger(logger_name)
205
+ logger.setLevel(getattr(logging, level))
206
+
207
+
208
+ def get_logger(name: str) -> logging.Logger:
209
+ """
210
+ Get a logger with the specified name, automatically mapping long module names to short ones.
211
+
212
+ Args:
213
+ name: Logger name, typically __name__
214
+
215
+ Returns:
216
+ Configured logger instance with short name if available
217
+ """
218
+ # Mapping of full module names to short names (8 chars max for proper centering)
219
+ name_mappings = {
220
+ "arbor.server.services.inference_manager": "infer",
221
+ "arbor.server.services.grpo_manager": "grpo",
222
+ "arbor.server.services.file_manager": "files",
223
+ "arbor.server.services.health_manager": "health",
224
+ "arbor.server.services.job_manager": "jobs",
225
+ "arbor.server.services.training_manager": "train",
226
+ "arbor.server.services.comms.comms": "comms",
227
+ "arbor.server.services.scripts.sft_training": "sft",
228
+ "arbor.server.services.scripts.grpo_training": "grpo",
229
+ "arbor.config": "config",
230
+ "arbor.cli": "cli",
231
+ "__main__": "main",
232
+ # Add uvicorn loggers
233
+ "uvicorn": "api",
234
+ "uvicorn.access": "api",
235
+ "uvicorn.error": "api",
236
+ }
237
+
238
+ # Use short name if available, otherwise use the provided name
239
+ short_name = name_mappings.get(name, name)
240
+ return logging.getLogger(short_name)
241
+
242
+
243
+ def log_system_info():
244
+ """Log system information at startup."""
245
+ logger = get_logger("arbor.startup")
246
+
247
+ logger.info("=" * 60)
248
+ logger.info("ARBOR SYSTEM STARTUP")
249
+ logger.info("=" * 60)
250
+
251
+ # This will be populated by the health manager
252
+ logger.info("System information logged via health manager")
253
+
254
+
255
+ def log_configuration(config: Dict[str, Any]):
256
+ """Log configuration information."""
257
+ logger = get_logger("arbor.config")
258
+
259
+ logger.info("Logging configuration:")
260
+ for key, value in config.items():
261
+ logger.info(f" {key}: {value}")
262
+
263
+
264
+ # Context manager for temporary log level changes
265
+ class LogLevel:
266
+ """Context manager to temporarily change log level."""
267
+
268
+ def __init__(self, logger_name: str, level: str):
269
+ self.logger = logging.getLogger(logger_name)
270
+ self.level = getattr(logging, level.upper())
271
+ self.original_level = None
272
+
273
+ def __enter__(self):
274
+ self.original_level = self.logger.level
275
+ self.logger.setLevel(self.level)
276
+ return self.logger
277
+
278
+ def __exit__(self, exc_type, exc_val, exc_tb):
279
+ self.logger.setLevel(self.original_level)
280
+
281
+
282
+ def apply_uvicorn_formatting():
283
+ """
284
+ Apply our custom formatting to uvicorn loggers after they're set up.
285
+ This runs after the FastAPI app is created to avoid interfering with startup.
286
+ """
287
+ console_formatter = ColoredFormatter("%(name)s - %(levelname)s - %(message)s")
288
+
289
+ # List of uvicorn loggers to modify
290
+ uvicorn_loggers = ["uvicorn", "uvicorn.error", "uvicorn.access"]
291
+
292
+ for logger_name in uvicorn_loggers:
293
+ logger = logging.getLogger(logger_name)
294
+
295
+ # Update formatters for existing handlers
296
+ for handler in logger.handlers:
297
+ if hasattr(handler, "setFormatter"):
298
+ handler.setFormatter(console_formatter)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arbor-ai
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Summary: A framework for fine-tuning and managing language models
5
5
  Author-email: Noah Ziems <nziems2@nd.edu>
6
6
  Project-URL: Homepage, https://github.com/Ziems/arbor
@@ -14,7 +14,7 @@ Requires-Dist: uvicorn
14
14
  Requires-Dist: click
15
15
  Requires-Dist: python-multipart
16
16
  Requires-Dist: pydantic-settings
17
- Requires-Dist: vllm>=0.8.5.post1
17
+ Requires-Dist: vllm==0.8.5.post1
18
18
  Requires-Dist: transformers
19
19
  Requires-Dist: trl>=0.17.0
20
20
  Requires-Dist: peft
@@ -43,7 +43,8 @@ Install Arbor via pip:
43
43
  pip install -U arbor-ai
44
44
  ```
45
45
 
46
- Optionally, you can also install:
46
+ Optionally, you can also install flash attention to speed up inference. <br/>
47
+ This can take 15+ minutes to install on some setups:
47
48
  ```bash
48
49
  pip install flash-attn --no-build-isolation
49
50
  ```
@@ -52,27 +53,16 @@ pip install flash-attn --no-build-isolation
52
53
 
53
54
  ## ⚡ Quick Start
54
55
 
55
- ### 1️⃣ Make an `arbor.yaml` File
56
-
57
- This is all dependent on your setup. Here is an example of one:
58
- ```yaml
59
- inference:
60
- gpu_ids: '0'
61
-
62
- training:
63
- gpu_ids: '1, 2'
64
- ```
65
- Which will use the `GPU:0` for inference with `GPU:1` and `GPU:2` reserved for training. We generally recommend splitting the GPUs roughly evenly between inference and training.
66
-
67
- ### 2️⃣ Start the Server
56
+ ### 1️⃣ Start the Server
68
57
 
69
58
  **CLI:**
70
59
 
71
60
  ```bash
72
- python -m arbor.cli serve --arbor-config arbor.yaml
61
+ python -m arbor.cli serve
73
62
  ```
63
+ On the first run you'll be asked which GPUs will be used for training and which for inference. For more that one GPU, separate the ids by comma: `1, 2`. Your config file will be saved in `~/.arbor/config.yaml` should you want to edit these configs in the future.
74
64
 
75
- ### 3️⃣ Optimize a DSPy Program
65
+ ### 2️⃣ Optimize a DSPy Program
76
66
 
77
67
  Follow the DSPy tutorials here to see usage examples:
78
68
  [DSPy RL Optimization Examples](https://dspy.ai/tutorials/rl_papillon/)
@@ -0,0 +1,51 @@
1
+ arbor/__init__.py,sha256=DKqMupRY_1oOt7WfwU_6g4FVbTBJjU83p7yEGC-JAhs,458
2
+ arbor/cli.py,sha256=YK-MIFxWb4ZfNb-UtK6t-EgTk1XQRq0dVOzdGf7_AY8,4867
3
+ arbor/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ arbor/client/api.py,sha256=86bgHuGM_AvI1Uhic_QaCnpF4VFqXie9ZzxmbTXUPpQ,19
5
+ arbor/client/arbor_client.py,sha256=laGmeTMyGzwKOBGjpOWEZdDXTwsp_MUhp6umiLufncs,8320
6
+ arbor/server/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
7
+ arbor/server/main.py,sha256=Ww4HfxltENIIe4TCq4x_tis69tJ7IhQ9o70BEfRT7MI,1177
8
+ arbor/server/api/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
9
+ arbor/server/api/models/schemas.py,sha256=yQzZEdYpUDi1BOQi2Ws7pn09Bq5Y_V8ae-oOEKMeD4M,6296
10
+ arbor/server/api/routes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ arbor/server/api/routes/files.py,sha256=DQC_ogH5zlzhHZSAA4Cj5wzK07XBIBVs2Po91W9rcDY,1835
12
+ arbor/server/api/routes/grpo.py,sha256=VHL68SO0lUp4zAZ1RfPCdgdRfO_ZRE7NA7LXvOZwo-c,1914
13
+ arbor/server/api/routes/inference.py,sha256=Vyh6atkEOhz8YLWgJ34dXUzkdLwqOfZC9LIhez-IfEI,2282
14
+ arbor/server/api/routes/jobs.py,sha256=BNdaSYUBJX6xSd6Pj6qx1DQJiZ5EKVxxbXDbEkfkCpw,3634
15
+ arbor/server/core/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
16
+ arbor/server/core/config.py,sha256=8l1BVuV09MZd7tPh1iK-bW2scQaQd0rmgN1K8WjIZWc,11116
17
+ arbor/server/core/config_manager.py,sha256=LTT8T6CQ063MiDM6udfc4IptHTLRW8OewyI1tpGcd_Q,3227
18
+ arbor/server/core/logging.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
+ arbor/server/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
+ arbor/server/services/dependencies.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
+ arbor/server/services/file_manager.py,sha256=kyRz5rJ2VHjdGWCqzqQ-HnNVaL42oLlJZQAuRwiDJLE,12199
22
+ arbor/server/services/grpo_manager.py,sha256=IC3rY2cqC_qRo8hnBWju44CreY7soz_qyw2paURmCsc,20571
23
+ arbor/server/services/health_manager.py,sha256=J5RkxHvXTzGITCaiQ9a_G_h8YYQLAEt69DdL7-Xj1VM,6475
24
+ arbor/server/services/inference_manager.py,sha256=63GpZeHPIlj2QgNH4LXA4K2DSjofhWQRvd_bKlpaJyE,9925
25
+ arbor/server/services/job_manager.py,sha256=wrtB0cO48DZh7D7hq6POt6xgxlauDKVjK8foNTVZVTA,2180
26
+ arbor/server/services/training_manager.py,sha256=SM1TaKNF7Plm-nY6UQ2ytVSh4d5hgfVkLGx9vPXbx0E,21053
27
+ arbor/server/services/comms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
+ arbor/server/services/comms/comms.py,sha256=zTV1Wo4FGnOcl5tIjBOfcuvDPMu-VTSKBlDBXV4h6LY,7833
29
+ arbor/server/services/inference/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
+ arbor/server/services/inference/vllm_client.py,sha256=EwVuv4bUSK2rOGEL6YdGSfaYtA4NsZfTwWw_KKfMAiQ,18367
31
+ arbor/server/services/inference/vllm_serve.py,sha256=UZAGo7CyshR3-9fhXCTKhXeidqNqbY6LyU9DDNiX_Sw,109543
32
+ arbor/server/services/scripts/dpo_training.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
+ arbor/server/services/scripts/grpo_training.py,sha256=XJZ3PBJdXRP__XfiQBtqEqjRE4YKjjYrJ4ze5W9SRnY,22160
34
+ arbor/server/services/scripts/mmgrpo_training.py,sha256=aDaTGkyfceA-jhAdzfpehAzuSSGIT8gdfD_5z9IoBEk,19373
35
+ arbor/server/services/scripts/sft_training.py,sha256=BvCsOA2kg2SEsyd7P9mkerIICPORoASB-0r8EO3usrQ,3538
36
+ arbor/server/services/scripts/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
+ arbor/server/services/scripts/utils/arg_parser.py,sha256=ur_iyhc_Ie00tjq63vK4Sdeu2PGKwe6Dh6Iax2vw9jc,1022
38
+ arbor/server/services/scripts/utils/callbacks.py,sha256=iPE_bjNHSQyBLO0v7UjxsuWDjDvLvhQAGerBFX8UbnA,1347
39
+ arbor/server/services/scripts/utils/comms_monitors.py,sha256=RE9RxHR1yqXgc8VgRyhVwtwes7ofXeVgFcwIN5AVW_Y,7983
40
+ arbor/server/services/scripts/utils/dataset.py,sha256=O-g-BUwLdVxUiQEsn2G4VobOYJjspA_iXc7MMNXZLQ0,6178
41
+ arbor/server/services/scripts/utils/ingestion_monitor.py,sha256=r5t5vG_TO62PYiFQROfm1mzBESB10WlxFRgGN-IKtaI,1305
42
+ arbor/server/services/scripts/utils/mock_server.py,sha256=NX38oBtxEVS9-kreayTCSzg5Hhuum-3vK0uNcOBkdtw,4237
43
+ arbor/server/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
+ arbor/server/utils/helpers.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
+ arbor/server/utils/logging.py,sha256=UsG3cYgNk04pXadf5-NcYxvI8qYjB6o91N_P08FuoIg,10368
46
+ arbor_ai-0.2.2.dist-info/licenses/LICENSE,sha256=5vFGrbOFeXXM83JV9o16w7ohH4WLeu3-57GocJSz8ow,1067
47
+ arbor_ai-0.2.2.dist-info/METADATA,sha256=1Jw-RJostZFj8mR9mIz_p8LLLpyh7qKZSPmrRn0Otzw,2776
48
+ arbor_ai-0.2.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
49
+ arbor_ai-0.2.2.dist-info/entry_points.txt,sha256=PGBX-MfNwfIl8UPFgsX3gjtXLqSogRhOktKMpZUysD0,40
50
+ arbor_ai-0.2.2.dist-info/top_level.txt,sha256=jzWdp3BRYqvZDMFsPajrcftvvlluzVDErkD8IMRfhYs,6
51
+ arbor_ai-0.2.2.dist-info/RECORD,,
@@ -1,42 +0,0 @@
1
- arbor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- arbor/cli.py,sha256=6S_nT93Zof6nB01n-xA7hSzssREzY13Oyh_jrElyTTY,3490
3
- arbor/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- arbor/client/api.py,sha256=86bgHuGM_AvI1Uhic_QaCnpF4VFqXie9ZzxmbTXUPpQ,19
5
- arbor/server/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
6
- arbor/server/main.py,sha256=tY4Vlaaj4oq1FTGYOkbFMGF0quLEeR-VBaKaXhQ5mEE,382
7
- arbor/server/api/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
8
- arbor/server/api/models/schemas.py,sha256=394FHmIxAWVwED3z5tjnJCsyrgSWXg2SFWvMM1oKqOI,6177
9
- arbor/server/api/routes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- arbor/server/api/routes/files.py,sha256=DQC_ogH5zlzhHZSAA4Cj5wzK07XBIBVs2Po91W9rcDY,1835
11
- arbor/server/api/routes/grpo.py,sha256=Yc4FxieuUbJ7Dbd-93uN4syQu9h2eQU4R9ZvnE_axRU,1982
12
- arbor/server/api/routes/inference.py,sha256=txLF4ANa0ZSaROrbvSaPZVFOSzn4so9e7mjNKnt2bcM,2182
13
- arbor/server/api/routes/jobs.py,sha256=BNdaSYUBJX6xSd6Pj6qx1DQJiZ5EKVxxbXDbEkfkCpw,3634
14
- arbor/server/core/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
15
- arbor/server/core/config.py,sha256=Mx77S3ByIMvHmPDikQLcczhzA5so3Vrw_U4QefOiHOU,1257
16
- arbor/server/core/logging.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- arbor/server/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
- arbor/server/services/dependencies.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- arbor/server/services/file_manager.py,sha256=Z9z4A4EzvPauid_DBfpim401DDtuJy_TbX4twTWDJWI,12119
20
- arbor/server/services/grpo_manager.py,sha256=jY4kc7wlKKoi7RigjJiH1VaxX6qJCOxyEc0oYCkqPlQ,18549
21
- arbor/server/services/inference_manager.py,sha256=a1c5zYbjk6fPM3egX2McKv7ZWPN7c-QH_Qogu9iay90,9597
22
- arbor/server/services/job_manager.py,sha256=m_d4UPwN_82f7t7K443DaFpFoyv7JZSZKml8tawt1Bk,2186
23
- arbor/server/services/training_manager.py,sha256=oQdhpfxdgp_lCTb_lxhvjupdLrcg6HL3TEbct_q9F6I,21065
24
- arbor/server/services/comms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
- arbor/server/services/comms/comms.py,sha256=3KN3mzwPvfW2_L5hq02JdAk6yOMyhY0_pBz-DDr5A3o,7694
26
- arbor/server/services/inference/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
- arbor/server/services/inference/vllm_client.py,sha256=06-VfdcwKqq8_ZRWaER3OnSVLtvL87bLdljSrkXfm-A,18269
28
- arbor/server/services/inference/vllm_serve.py,sha256=UZAGo7CyshR3-9fhXCTKhXeidqNqbY6LyU9DDNiX_Sw,109543
29
- arbor/server/services/scripts/dpo_training.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
- arbor/server/services/scripts/grpo_training.py,sha256=6kXzMwn3rZXHdEn0xe_Kd9d7tbdYb76zE0zbi02xCm4,31314
31
- arbor/server/services/scripts/sft_training.py,sha256=jgDMxZn9RFH9ys_7OF9Is8pQ9V97O2KzWg22Gveh3yE,3410
32
- arbor/server/services/scripts/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- arbor/server/services/scripts/utils/arg_parser.py,sha256=ur_iyhc_Ie00tjq63vK4Sdeu2PGKwe6Dh6Iax2vw9jc,1022
34
- arbor/server/services/scripts/utils/dataset.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
- arbor/server/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
- arbor/server/utils/helpers.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
- arbor_ai-0.2.1.dist-info/licenses/LICENSE,sha256=5vFGrbOFeXXM83JV9o16w7ohH4WLeu3-57GocJSz8ow,1067
38
- arbor_ai-0.2.1.dist-info/METADATA,sha256=34XAZBm8OLlsSBicLmRn_hhbltn0pDNlAj5WOjn9LtE,2791
39
- arbor_ai-0.2.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
40
- arbor_ai-0.2.1.dist-info/entry_points.txt,sha256=PGBX-MfNwfIl8UPFgsX3gjtXLqSogRhOktKMpZUysD0,40
41
- arbor_ai-0.2.1.dist-info/top_level.txt,sha256=jzWdp3BRYqvZDMFsPajrcftvvlluzVDErkD8IMRfhYs,6
42
- arbor_ai-0.2.1.dist-info/RECORD,,