From 8f1b4e0962857d402f9d017fcbf387ef0eceb7c4 Mon Sep 17 00:00:00 2001
From: Joseph Redmon <pjreddie@gmail.com>
Date: Thu, 01 Sep 2016 23:48:41 +0000
Subject: [PATCH] updates and things
---
src/server.c | 249 +++++++++++++++++++++++++++++++------------------
1 files changed, 159 insertions(+), 90 deletions(-)
diff --git a/src/server.c b/src/server.c
index bcb59f5..6e5105e 100644
--- a/src/server.c
+++ b/src/server.c
@@ -1,136 +1,205 @@
+#include <stdio.h> /* needed for sockaddr_in */
+#include <string.h> /* needed for sockaddr_in */
+#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h> /* needed for sockaddr_in */
-#include <stdio.h> /* needed for sockaddr_in */
-#include <string.h> /* needed for sockaddr_in */
#include <netdb.h>
+#include <pthread.h>
+#include <time.h>
+#include "mini_blas.h"
+#include "utils.h"
+#include "parser.h"
#include "server.h"
#include "connected_layer.h"
+#include "convolutional_layer.h"
-#define MESSAGESIZE 50012
-#define NUMFLOATS ((MESSAGESIZE-12)/4)
-#define SERVER_PORT 9876
-#define CLIENT_PORT 9879
+#define SERVER_PORT 9423
#define STR(x) #x
-#define PARAMETER_SERVER localhost
-typedef struct{
- int layer;
- int wob;
- int offset;
- float data[NUMFLOATS];
-} message;
-
-int socket_setup(int port)
+int socket_setup(int server)
{
- static int fd = 0; /* our socket */
- if(fd) return fd;
- struct sockaddr_in myaddr; /* our address */
+ int fd = 0; /* our socket */
+ struct sockaddr_in me; /* our address */
/* create a UDP socket */
- if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
- perror("cannot create socket\n");
- fd=0;
- return 0;
+ if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
+ error("cannot create socket");
}
/* bind the socket to any valid IP address and a specific port */
+ if (server == 1){
+ bzero((char *) &me, sizeof(me));
+ me.sin_family = AF_INET;
+ me.sin_addr.s_addr = htonl(INADDR_ANY);
+ me.sin_port = htons(SERVER_PORT);
- memset((char *)&myaddr, 0, sizeof(myaddr));
- myaddr.sin_family = AF_INET;
- myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- myaddr.sin_port = htons(port);
-
- if (bind(fd, (struct sockaddr *)&myaddr, sizeof(myaddr)) < 0) {
- perror("bind failed");
- fd=0;
- return 0;
+ if (bind(fd, (struct sockaddr *)&me, sizeof(me)) < 0) {
+ error("bind failed");
+ }
}
+
return fd;
}
+typedef struct{
+ int fd;
+ int counter;
+ network net;
+} connection_info;
+
+void read_and_add_into(int fd, float *a, int n)
+{
+ float *buff = calloc(n, sizeof(float));
+ read_all(fd, (char*) buff, n*sizeof(float));
+ axpy_cpu(n, 1, buff, 1, a, 1);
+ free(buff);
+}
+
+void handle_connection(void *pointer)
+{
+ connection_info info = *(connection_info *) pointer;
+ free(pointer);
+ //printf("New Connection\n");
+ if(info.counter%100==0){
+ char buff[256];
+ sprintf(buff, "unikitty/net_%d.part", info.counter);
+ save_network(info.net, buff);
+ }
+ int fd = info.fd;
+ network net = info.net;
+ int i;
+ for(i = 0; i < net.n; ++i){
+ if(net.types[i] == CONVOLUTIONAL){
+ convolutional_layer layer = *(convolutional_layer *) net.layers[i];
+
+ read_and_add_into(fd, layer.bias_updates, layer.n);
+ int num = layer.n*layer.c*layer.size*layer.size;
+ read_and_add_into(fd, layer.filter_updates, num);
+ }
+ if(net.types[i] == CONNECTED){
+ connected_layer layer = *(connected_layer *) net.layers[i];
+
+ read_and_add_into(fd, layer.bias_updates, layer.outputs);
+ read_and_add_into(fd, layer.weight_updates, layer.inputs*layer.outputs);
+ }
+ }
+ for(i = 0; i < net.n; ++i){
+ if(net.types[i] == CONVOLUTIONAL){
+ convolutional_layer layer = *(convolutional_layer *) net.layers[i];
+ update_convolutional_layer(layer);
+
+ write_all(fd, (char*) layer.biases, layer.n*sizeof(float));
+ int num = layer.n*layer.c*layer.size*layer.size;
+ write_all(fd, (char*) layer.filters, num*sizeof(float));
+ }
+ if(net.types[i] == CONNECTED){
+ connected_layer layer = *(connected_layer *) net.layers[i];
+ update_connected_layer(layer);
+ write_all(fd, (char *)layer.biases, layer.outputs*sizeof(float));
+ write_all(fd, (char *)layer.weights, layer.outputs*layer.inputs*sizeof(float));
+ }
+ }
+ //printf("Received updates\n");
+ close(fd);
+}
+
void server_update(network net)
{
- int fd = socket_setup(SERVER_PORT);
- struct sockaddr_in remaddr; /* remote address */
- socklen_t addrlen = sizeof(remaddr); /* length of addresses */
- int recvlen; /* # bytes received */
- unsigned char buf[MESSAGESIZE]; /* receive buffer */
- message m;
-
- int count = 0;
+ int fd = socket_setup(1);
+ int counter = 18000;
+ listen(fd, 64);
+ struct sockaddr_in client; /* remote address */
+ socklen_t client_size = sizeof(client); /* length of addresses */
+ time_t t=0;
while(1){
- recvlen = recvfrom(fd, buf, MESSAGESIZE, 0, (struct sockaddr *)&remaddr, &addrlen);
- memcpy(&m, buf, recvlen);
- //printf("received %d bytes\n", recvlen);
- //printf("layer %d wob %d offset %d\n", m.layer, m.wob, m.offset);
- ++count;
- if(count % 100 == 0) printf("%d\n", count);
+ connection_info *info = calloc(1, sizeof(connection_info));
+ info->net = net;
+ info->counter = counter;
+ pthread_t worker;
+ int connection = accept(fd, (struct sockaddr *) &client, &client_size);
+ if(!t) t=time(0);
+ info->fd = connection;
+ pthread_create(&worker, NULL, (void *) &handle_connection, info);
+ ++counter;
+ printf("%d\n", counter);
+ //if(counter == 1024) break;
}
- //printf("%s\n", buf);
+ close(fd);
}
-void client_update(network net)
+void client_update(network net, char *address)
{
- int fd = socket_setup(CLIENT_PORT);
- struct hostent *hp; /* host information */
- struct sockaddr_in servaddr; /* server address */
- printf("%ld %ld\n", sizeof(message), MESSAGESIZE);
- char *my_message = "this is a test message";
+ int fd = socket_setup(0);
- unsigned char buf[MESSAGESIZE];
- message m;
+ struct hostent *hp; /* host information */
+ struct sockaddr_in server; /* server address */
/* fill in the server's address and data */
- memset((char*)&servaddr, 0, sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- servaddr.sin_port = htons(SERVER_PORT);
+ bzero((char*)&server, sizeof(server));
+ server.sin_family = AF_INET;
+ server.sin_port = htons(SERVER_PORT);
/* look up the address of the server given its name */
- hp = gethostbyname("localhost");
+ hp = gethostbyname(address);
if (!hp) {
+ perror("no such host");
fprintf(stderr, "could not obtain address of %s\n", "localhost");
}
/* put the host's address into the server address structure */
- memcpy((void *)&servaddr.sin_addr, hp->h_addr_list[0], hp->h_length);
+ memcpy((void *)&server.sin_addr, hp->h_addr_list[0], hp->h_length);
+ if (connect(fd, (struct sockaddr *) &server, sizeof(server)) < 0) {
+ error("error connecting");
+ }
/* send a message to the server */
- int i, j, k;
+ int i;
+ //printf("Sending\n");
for(i = 0; i < net.n; ++i){
+ if(net.types[i] == CONVOLUTIONAL){
+ convolutional_layer layer = *(convolutional_layer *) net.layers[i];
+ write_all(fd, (char*) layer.bias_updates, layer.n*sizeof(float));
+ int num = layer.n*layer.c*layer.size*layer.size;
+ write_all(fd, (char*) layer.filter_updates, num*sizeof(float));
+ memset(layer.bias_updates, 0, layer.n*sizeof(float));
+ memset(layer.filter_updates, 0, num*sizeof(float));
+ }
if(net.types[i] == CONNECTED){
- connected_layer *layer = (connected_layer *) net.layers[i];
- m.layer = i;
- m.wob = 0;
- for(j = 0; j < layer->outputs; j += NUMFLOATS){
- m.offset = j;
-
- int num = layer->outputs - j;
- if(NUMFLOATS < num) num = NUMFLOATS;
-
- memcpy(m.data, &layer->bias_updates[j], num*sizeof(float));
- memcpy(buf, &m, MESSAGESIZE);
-
- if (sendto(fd, buf, MESSAGESIZE, 0, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
- perror("sendto failed");
- }
- }
- m.wob = 1;
- for(j = 0; j < layer->outputs*layer->inputs; j += NUMFLOATS){
- m.offset = j;
-
- int num = layer->outputs*layer->inputs - j;
- if(NUMFLOATS < num) num = NUMFLOATS;
-
- memcpy(m.data, &layer->weight_updates[j], num*sizeof(float));
- memcpy(buf, &m, MESSAGESIZE);
-
- if (sendto(fd, buf, MESSAGESIZE, 0, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
- perror("sendto failed");
- }
- }
+ connected_layer layer = *(connected_layer *) net.layers[i];
+ write_all(fd, (char *)layer.bias_updates, layer.outputs*sizeof(float));
+ write_all(fd, (char *)layer.weight_updates, layer.outputs*layer.inputs*sizeof(float));
+ memset(layer.bias_updates, 0, layer.outputs*sizeof(float));
+ memset(layer.weight_updates, 0, layer.inputs*layer.outputs*sizeof(float));
}
}
+ //printf("Sent\n");
+
+ for(i = 0; i < net.n; ++i){
+ if(net.types[i] == CONVOLUTIONAL){
+ convolutional_layer layer = *(convolutional_layer *) net.layers[i];
+
+ read_all(fd, (char*) layer.biases, layer.n*sizeof(float));
+ int num = layer.n*layer.c*layer.size*layer.size;
+ read_all(fd, (char*) layer.filters, num*sizeof(float));
+
+#ifdef GPU
+ push_convolutional_layer(layer);
+ #endif
+ }
+ if(net.types[i] == CONNECTED){
+ connected_layer layer = *(connected_layer *) net.layers[i];
+
+ read_all(fd, (char *)layer.biases, layer.outputs*sizeof(float));
+ read_all(fd, (char *)layer.weights, layer.outputs*layer.inputs*sizeof(float));
+
+#ifdef GPU
+ push_connected_layer(layer);
+ #endif
+ }
+ }
+ //printf("Updated\n");
+ close(fd);
}
--
Gitblit v1.10.0